Float indeks enterpolasyonunu MATLAB'den Python'a çevirme

Sep 08 2020

Ö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

1 lpeak Sep 08 2020 at 16:56

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.