Traduction de l'interpolation d'index flottant de MATLAB vers Python
Par exemple, j'ai un tableau d'index
ax = [0, 0.2, 2] #start from index 0: python
et matrice 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
Dans MATLAB, en exécutant ce code
[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');
Le résultat SIest
SI =
10 12 30
10 12 30
10 12 30
J'ai essayé de faire la même interpolation en Python, en utilisant NumPy. J'interpole d'abord par ligne, puis par colonne
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
Cependant, le résultat SIest
SI =
10 10 20
10 10 20
10 10 20
Pourquoi mes résultats utilisant Python sont-ils différents de ceux utilisant MATLAB?
Réponses
Il semble que vous vous sur-corrigiez en passant de MATLAB à Python, comme le montre votre premier extrait de code.
ax = [0, 0.2, 2] #start from index 0: python
Dans la logique numpy, cette séquence ne représente pas les index mais les coordonnées de la fonction à interpoler. Puisque vous prenez déjà soin d'incrémenter la coordonnée pour qu'elle soit compatible avec matlab ici:
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
Vous pouvez réutiliser la même coordonnée d'interpolation que vous avez utilisée dans Matlab:
ax = [1,1.2,3]
Code complet:
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
et résultat:
array([[10., 12., 30.],
[10., 12., 30.],
[10., 12., 30.]])
Explication sur le bogue
Depuis les axcoordonnées représentées les deux premières valeurs 0.0et 0.2étaient avant la première coordonnée de r_idx. D'après la documentation , l'interpolation sera par défaut I [:, x] [0].