Traduzione dell'interpolazione dell'indice float da MATLAB a Python
Ad esempio, ho un array di indici
ax = [0, 0.2, 2] #start from index 0: python
e 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
In MATLAB, eseguendo questo codice
[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');
Il risultato SIè
SI =
10 12 30
10 12 30
10 12 30
Ho provato a fare la stessa interpolazione in Python, usando NumPy. Interpolo prima per riga, poi per colonna
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
Tuttavia, il risultato SIè
SI =
10 10 20
10 10 20
10 10 20
Perché i miei risultati usando Python sono diversi da quelli usando MATLAB?
Risposte
Sembra che tu ti sia corretto eccessivamente passando da MATLAB a Python, come mostrato dal tuo primo estratto di codice.
ax = [0, 0.2, 2] #start from index 0: python
Nella logica numpy questa sequenza non rappresenta gli indici ma la coordinata per la funzione da interpolare. Dato che ti occupi già di incrementare la coordinata per essere compatibile con matlab qui:
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
Puoi riutilizzare la stessa coordinata di interpolazione che hai usato in Matlab:
ax = [1,1.2,3]
Codice completo:
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
e risultato:
array([[10., 12., 30.],
[10., 12., 30.],
[10., 12., 30.]])
Spiegazione del bug
Poiché le axcoordinate rappresentate i primi due valori 0.0e 0.2erano prima della prima coordinata di r_idx. Secondo la documentazione , l'interpolazione sarà predefinita su I [:, x] [0].