Übersetzung der Float-Index-Interpolation von MATLAB nach Python

Sep 08 2020

Zum Beispiel habe ich ein Indexarray

ax = [0, 0.2, 2] #start from index 0: python

und Matrix 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

Führen Sie in MATLAB diesen Code aus

[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');

Das Ergebnis SIist

SI =
10    12    30
10    12    30
10    12    30

Ich habe versucht, dieselbe Interpolation in Python mit NumPy durchzuführen. Ich interpoliere zuerst zeilenweise, dann spaltenweise

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

Das Ergebnis SIist jedoch

SI =
10    10    20
10    10    20
10    10    20

Warum unterscheiden sich meine Ergebnisse mit Python von denen mit MATLAB?

Antworten

1 lpeak Sep 08 2020 at 16:56

Es scheint, dass Sie sich selbst überkorrigiert haben, indem Sie von MATLAB zu Python gewechselt sind, wie Ihr erster Code-Auszug zeigt.

ax = [0, 0.2, 2] #start from index 0: python

In der Numpy-Logik repräsentiert diese Sequenz nicht die Indizes, sondern die Koordinate für die zu interpolierende Funktion. Da Sie sich bereits darum kümmern, die Koordinate zu erhöhen, um hier mit matlab kompatibel zu sein:

r_idx = np.arange(1, I.shape[0]+1)
c_idx = np.arange(1, I.shape[1]+1)

Sie können dieselbe Interpolationskoordinate wiederverwenden, die Sie in Matlab verwendet haben:

ax = [1,1.2,3]

Vollständiger Code:

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

und Ergebnis:

array([[10., 12., 30.],
       [10., 12., 30.],
       [10., 12., 30.]])

Erklärung zum Fehler

Da axdargestellte Koordinaten die ersten beiden Werte 0.0und 0.2waren vor der ersten Koordinate von r_idx. Gemäß der Dokumentation wird für die Interpolation standardmäßig I [:, ​​x] [0] verwendet.