Интерполяция Scipy Python - PullRequest
       13

Интерполяция Scipy Python

1 голос
/ 26 марта 2020

Я пытаюсь использовать scipy.interpolate.interp2d, но у меня есть проблема.

Это мой код:

import scipy.interpolate as itp
import numpy as np
import matplotlib.pyplot as plt

z_srtrm = 100 * np.random.rand(4,4)
x_srtrm = np.arange(0,4)
y_srtrm = np.arange(0,4)

I = itp.interp2d(x_srtrm,y_srtrm,z_srtrm,kind='cubic') 
xi = np.linspace(0,4,100) 
yi = np.linspace(0,4,100) 
Z = I(xi,yi) 

zx = np.arange(0,100)
zy = np.arange(0,100)

I_inv = itp.interp2d(zx,zy,Z,kind='cubic') 
xj = np.linspace(0,100,4) 
yj = np.linspace(0,100,4) 
z = I_inv(xj,yj)

fig = plt.figure()
ax1 = fig.add_subplot(1,3,1)
ax1.imshow(z_srtrm)
ax2 = fig.add_subplot(1,3,2)
ax2.imshow(Z)
ax3 = fig.add_subplot(1,3,3)
ax3.imshow(z)

plt.show()

Обычно z_srtm должен быть равен z, но это не так. Можете ли вы объяснить мне, почему? Заранее спасибо.

1 Ответ

1 голос
/ 26 марта 2020

Причина - в отдельных ошибках, связанных с тем, как работает np.arange:

>>> np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Необходимо внести два изменения. Во-первых, x_srtrm и y_srtrm go от 0 до 3, поэтому вам необходимо сохранить это при повышении частоты дискретизации:

I = itp.interp2d(x_srtrm, y_srtrm, z_srtrm, kind='cubic') 
xi = np.linspace(0, 3, 100) 
yi = np.linspace(0, 3, 100)
Z = I(xi, yi)

Во-вторых, zx и zy go от 0 до 99, поэтому вы должны учитывать это при понижении частоты дискретизации:

I_inv = itp.interp2d(zx, zy, Z, kind='cubic') 
xj = np.linspace(0, 99, 4)
yj = np.linspace(0, 99, 4)
z = I_inv(xj, yj)
...