Traduzione dell'interpolazione dell'indice float da MATLAB a Python

Sep 08 2020

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

1 lpeak Sep 08 2020 at 16:56

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].