scipy interp2(X,Y,Z,Xi,YI)从Matlab到Python

watbbzwu  于 7个月前  发布在  Matlab
关注(0)|答案(5)|浏览(59)

我需要这个Matlab function的确切的Python等效函数来插值矩阵。
在Matlab中,我有:

interp2(X, Y, Z, XI, YI)

字符串
在Scipy,我有:

interp2d(X, Y, Z).


在Scipy中,Xi和YI都不见了。我怎么解决这个问题呢?我正在使用Matlab中的所有参数。

41zrol4v

41zrol4v1#

正确的语法是ip = interp2d(x, y, z); zi = ip(xi, yi)
此外,interp2dinterp2并不完全相同。RectBivariateSpline更接近。

34gzjxbg

34gzjxbg2#

我也遇到过同样的问题,并且发现scipy.ndimage.map_coordinatesVq = interp2(V,Xq,Yq)的功能是一样的。请阅读这些命令的文档,以找到解决方案。
用Matlab的Vq = interp2(V,Xq,Yq)来实现:

Vq = scipy.ndimage.map_coordinates(V, [Xq.ravel(), Yq.ravel()], order=3, mode='nearest').reshape(V.shape)

字符串

eqqqjvef

eqqqjvef3#

对于interp2(v,xq,yq)

ip = scipy.interpolate.griddata((y.ravel(),x.ravel()),distorted.ravel(),(yq.ravel(),xq.ravel()))

字符串
请注意,返回的结果需要调整大小。即(ip.resize(img.shape)
这里y,x

x,y = np.meshgrid(np.arange(w),np.arange(h))


其中w,h分别是图像的宽度和高度。
有关更多信息,您可以阅读griddata文档。https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html
对于interp2(X,Y,V,Xq,Yq),只需将x,y替换为X,Y

2o7dmzc5

2o7dmzc54#

Interp 2d输出另一个函数,允许您调用Xi和Yi。但是,请注意!它将它们作为矩阵进行计算,而不是标量。您将不得不使用for循环来分别计算Xi和Yi的每对值,并获得与MATLAB相同的行为。

F=interpolate.interp2d(X,Y,Z)
Zi=[]
for i, j in zip(Xi,Yi)
   Zi.append(F(i,j))

字符串

iqjalb3h

iqjalb3h5#

我只是想自己权衡一下,因为我也在努力寻找一个相当于MATLAB代码的Python:

[X, Y] = meshgrid(x, y')
[XI, YI] = meshgrid(xi, yi')

Vq = interp2(X, Y, Z', XI, YI)
coeff = diag(Vq)'

字符串
在 * 我的特定情况下 *,MATLAB变量和大小是,

*xy分别为(m x 1)和(1 x n)。
*Xiyi:均为(1 x w)大小。
*X&Y:(m x n)我的采样点的网格。
*Z:(n x m)对应函数值的数组(在函数中转置)。
*XiYI:都是我查询点的(w x w)网格。
*coeff:(1 x w)插值系数的数组。

我尝试了scipy.interpolate. BivariateSpline,并能够获得MATLAB代码产生的精确结果。这只是有点棘手,因为文档有点混乱,但关键是使用.ev方法。Python代码如下:

from scipy.interpolate import RectBivariateSpline

# NOTE: The x, y, xi, and yi arrays are kept 1-dimensional, and not converted to meshgrids.

interp = RectBivariateSpline(x, y, Z, kx=1, ky=1)
coeff = interp.ev(xi, yi)


这段代码应该给你给予和MATLAB代码完全相同的结果,其中我的Python变量的大小如下,

*xy分别为(m,i)和(n,i)。
*Z:(m x n),转自MATLAB。
*Xi&yi:两个变量都是(w,)形状。
*coeff:(w,)。

相关问题