Übersetzung der Float-Index-Interpolation von MATLAB nach Python
Zum Beispiel habe ich ein Indexarray
ax = [0, 0.2, 2] #start from index 0: python
und Matrix I
I=
10 20 30 40 50
10 20 30 40 50
10 20 30 40 50
10 20 30 40 50
10 20 30 40 50
Führen Sie in MATLAB diesen Code aus
[gx, gy] = meshgrid([1,1.2,3], [1,1.2,3]);
I = [10:10:50];
I = vertcat(I,I,I,I,I)
SI = interp2(I,gx,gy,'bilinear');
Das Ergebnis SIist
SI =
10 12 30
10 12 30
10 12 30
Ich habe versucht, dieselbe Interpolation in Python mit NumPy durchzuführen. Ich interpoliere zuerst zeilenweise, dann spaltenweise
import numpy as np
ax = np.array([0.0, 0.2, 2.0])
ay = np.array([0.0, 0.2, 2.0])
I = np.array([[10,20,30,40,50]])
I = np.concatenate((I,I,I,I,I), axis=0)
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
I_row = np.transpose(np.array([np.interp(ax, r_idx, I[:,x]) for x in range(0,I.shape[0])]))
I_col = np.array([np.interp(ay, c_idx, I_row[y,:]) for y in range(0, I_row.shape[0])])
SI = I_col
Das Ergebnis SIist jedoch
SI =
10 10 20
10 10 20
10 10 20
Warum unterscheiden sich meine Ergebnisse mit Python von denen mit MATLAB?
Antworten
Es scheint, dass Sie sich selbst überkorrigiert haben, indem Sie von MATLAB zu Python gewechselt sind, wie Ihr erster Code-Auszug zeigt.
ax = [0, 0.2, 2] #start from index 0: python
In der Numpy-Logik repräsentiert diese Sequenz nicht die Indizes, sondern die Koordinate für die zu interpolierende Funktion. Da Sie sich bereits darum kümmern, die Koordinate zu erhöhen, um hier mit matlab kompatibel zu sein:
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
Sie können dieselbe Interpolationskoordinate wiederverwenden, die Sie in Matlab verwendet haben:
ax = [1,1.2,3]
Vollständiger Code:
import numpy as np
ax = np.array([1.0, 1.2, 3.0])
ay = np.array([1.0, 1.2, 3.0])
I = np.array([[10,20,30,40,50]])
I = np.concatenate((I,I,I,I,I), axis=0)
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
I_row = np.transpose(np.array([np.interp(ax, r_idx, I[:,x]) for x in range(0,I.shape[
0])]))
I_col = np.array([np.interp(ay, c_idx, I_row[y,:]) for y in range(0, I_row.shape[0])]
)
SI = I_col
und Ergebnis:
array([[10., 12., 30.],
[10., 12., 30.],
[10., 12., 30.]])
Erklärung zum Fehler
Da axdargestellte Koordinaten die ersten beiden Werte 0.0und 0.2waren vor der ersten Koordinate von r_idx. Gemäß der Dokumentation wird für die Interpolation standardmäßig I [:, x] [0] verwendet.