Float indeks enterpolasyonunu MATLAB'den Python'a çevirme
Örneğin, bir dizin dizim var
ax = [0, 0.2, 2] #start from index 0: python
ve matris 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
MATLAB'da bu kodu çalıştırarak
[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');
Oluşan SIolduğu
SI =
10 12 30
10 12 30
10 12 30
NumPy kullanarak Python'da aynı enterpolasyonu yapmaya çalıştım. Önce satır bazında, sonra sütun bazında enterpolasyon yapıyorum
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
Bununla birlikte, sonuçta elde edilen SIbir
SI =
10 10 20
10 10 20
10 10 20
Python kullanan sonuçlarım MATLAB kullananlardan neden farklı?
Yanıtlar
Görünüşe göre, ilk kod pasajınızda gösterildiği gibi, MATLAB'den Python'a geçerek kendinizi aşırı düzelttiniz.
ax = [0, 0.2, 2] #start from index 0: python
Numpy mantığında bu dizi indeksleri değil, fonksiyonun enterpolasyon yapacağı koordinatı temsil eder. Koordinatı matlab ile uyumlu olacak şekilde artırmaya zaten özen gösterdiğiniz için:
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
Matlab'da kullandığınız aynı enterpolasyon koordinatını yeniden kullanabilirsiniz:
ax = [1,1.2,3]
Tam kod:
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
ve sonuç:
array([[10., 12., 30.],
[10., 12., 30.],
[10., 12., 30.]])
Hata hakkında açıklama
Yana axkoordinatları, ilk iki değeri temsil 0.0ve 0.2ilk koordinatı önce olduğu r_idx. Belgelere göre , enterpolasyon varsayılan olarak I [:, x] [0] olacaktır.