我目前有一个大约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类型图,在带有数据的点之间进行插值以填充这些数据。
感谢您提供的任何帮助。
答案 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()
结果看起来像这样:
请注意,这与矩阵的确切方向不匹配。要这样做,您必须将绘图的原点更改为位于左上角,并可能转置数据。我会把它作为练习留给你。
此外,获取非na值的索引的方法有点粗糙,所以也许其他人可以对此进行评论(感谢seberg提示)。