Menerjemahkan interpolasi indeks float dari MATLAB ke Python
Misalnya, saya memiliki array indeks
ax = [0, 0.2, 2] #start from index 0: python
dan matriks 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
Di MATLAB, dengan menjalankan kode ini
[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');
Hasilnya SIadalah
SI =
10 12 30
10 12 30
10 12 30
Saya mencoba melakukan interpolasi yang sama dengan Python, menggunakan NumPy. Saya pertama-tama menginterpolasi baris, lalu kolom
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
Namun, hasilnya SIadalah
SI =
10 10 20
10 10 20
10 10 20
Mengapa hasil saya menggunakan Python berbeda dari yang menggunakan MATLAB?
Jawaban
Tampaknya Anda mengoreksi diri sendiri secara berlebihan dengan meneruskan dari MATLAB ke Python, seperti yang ditunjukkan oleh kutipan kode pertama Anda.
ax = [0, 0.2, 2] #start from index 0: python
Dalam logika numpy, urutan ini tidak mewakili indeks tetapi koordinat untuk fungsi yang akan diinterpolasi. Karena Anda sudah berhati-hati dalam meningkatkan koordinat agar kompatibel dengan matlab di sini:
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
Anda dapat menggunakan kembali koordinat interpolasi yang Anda gunakan di Matlab:
ax = [1,1.2,3]
Kode lengkap:
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
dan hasil:
array([[10., 12., 30.],
[10., 12., 30.],
[10., 12., 30.]])
Penjelasan tentang bug
Sejak axdiwakili koordinat dua nilai pertama 0.0dan 0.2sebelum koordinat pertama r_idx. Menurut dokumentasi , interpolasi akan default ke I [:, x] [0].