Python - 插值/ pcolor不均匀间隔的numpy矩阵

时间:2012-10-23 14:31:45

标签: python numpy matplotlib scipy mayavi

我目前有一个大约100x120的2d numpy矩阵。索引引用“坐标”,矩阵中的值是“高度”我试图使用类似于此处所示的“二维样条表示”的pcolor绘制此数据:

http://docs.scipy.org/doc/scipy-0.7.x/reference/tutorial/interpolate.html

我的问题是虽然我的所有“坐标”和“高度”都是整数,但坐标不是均匀的空间。例如,只有特定的行包含数据(不等于间距),并且每个包含数据的行对于每个其他条目只有一个“height”值(每行包含数据的行间距相同)。我的意思的一个简单例子如下:

[[nan,   3, nan,   1, nan,   2], 
 [nan, nan, nan, nan, nan, nan],
 [nan,   5, nan,   2, nan,   3],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan,   4, nan,   1, nan,   2]]

我一直在尝试按照我链接的插值/ pcolor示例,但一直没有成功。我的目标是在我的所有数据上都有一个很好的连续pcolor类型图,在带有数据的点之间进行插值以填充这些数据。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:4)

有什么问题?您只需要使用值提取单元格的索引,并将其传递给具有“height”值的interpolate函数。下面是一些代码。

import numpy as np
from numpy import nan
from scipy import interpolate
import matplotlib.pyplot as plt

a = np.array([[nan,   3, nan,   1, nan,   2], 
 [nan, nan, nan, nan, nan, nan],
 [nan,   5, nan,   2, nan,   3],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan, nan, nan, nan, nan, nan],
 [nan,   4, nan,   1, nan,   2]])

x, y = np.where(np.isfinite(a))
z = a[x,y]

xnew,ynew = np.mgrid[0:6:70j,0:6:70j]
tck = interpolate.bisplrep(x,y,z,s=0, kx=1, ky=1)
znew = interpolate.bisplev(xnew[:,0],ynew[0,:],tck)

plt.figure()
plt.pcolor(xnew,ynew,znew)
plt.colorbar()
plt.title("Interpolated function.")
plt.show()

结果看起来像这样:

enter image description here

请注意,这与矩阵的确切方向不匹配。要这样做,您必须将绘图的原点更改为位于左上角,并可能转置数据。我会把它作为练习留给你。

此外,获取非na值的索引的方法有点粗糙,所以也许其他人可以对此进行评论(感谢seberg提示)。