Dịch nội suy chỉ số float từ MATLAB sang Python
Ví dụ, tôi có một mảng chỉ mục
ax = [0, 0.2, 2] #start from index 0: python
và ma trận 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
Trong MATLAB, bằng cách chạy mã này
[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');
Kết quả SIlà
SI =
10 12 30
10 12 30
10 12 30
Tôi đã cố gắng thực hiện nội suy tương tự trong Python, sử dụng NumPy. Đầu tiên tôi nội suy theo hàng, sau đó nội suy theo cột
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
Tuy nhiên, kết quả SIlà
SI =
10 10 20
10 10 20
10 10 20
Tại sao kết quả sử dụng Python của tôi khác với kết quả sử dụng MATLAB?
Trả lời
Có vẻ như bạn đã tự sửa lỗi quá mức bằng cách chuyển từ MATLAB sang Python, như được hiển thị trong đoạn trích mã đầu tiên của bạn.
ax = [0, 0.2, 2] #start from index 0: python
Trong logic numpy, chuỗi này không đại diện cho các chỉ mục mà là tọa độ cho hàm để nội suy. Vì bạn đã quan tâm đến việc tăng tọa độ để tương thích với matlab ở đây:
r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)
Bạn có thể sử dụng lại cùng một tọa độ nội suy mà bạn đã sử dụng trong Matlab:
ax = [1,1.2,3]
Mã đầy đủ:
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
và kết quả:
array([[10., 12., 30.],
[10., 12., 30.],
[10., 12., 30.]])
Giải thích về lỗi
Vì axtọa độ được biểu diễn nên hai giá trị đầu tiên 0.0và 0.2nằm trước tọa độ đầu tiên của r_idx. Theo tài liệu , phép nội suy sẽ mặc định là I [:, x] [0].