比较你的代码示例和问题标题,我觉得你有点困惑...
在你的示例代码中,你创建了一个规则网格的随机数据,然后将其重新采样到另一个规则网格上。你的示例中没有任何不规则数据...
(另外,这段代码不能直接运行,你应该研究一下meshgrid
,而不是通过循环生成x和y网格。)
如果你想要对已经规则采样的网格进行重新采样,就像你在示例中所做的那样,有比griddata更高效的方法,或者说比我下面要描述的任何方法都更高效。(在这种情况下,scipy.ndimage.map_coordinates
非常适合解决你的问题。)
根据你的问题,听起来你有一些不规则间距的数据,你想要插值到一个规则网格上。
在这种情况下,你可能有一些像这样的点:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
ndata = 20
xmin, xmax = -8, 8
ymin, ymax = 380, 2428
x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)
plt.scatter(x,y,c=z)
plt.axis([xmin, xmax, ymin, ymax])
plt.colorbar()
plt.show()
![Randomly generated data](https://istack.dev59.com/3rpGh.webp)
你可以像之前一样对数据进行插值处理...(继续上面的代码片段...)
ny, nx = 512, 115
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
xi, yi = np.meshgrid(xi, yi)
zi = griddata( (x,y), z, (xi,yi) )
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()
![Poorly interpolated data](https://istack.dev59.com/qMu8L.webp)
然而,你会注意到在网格中出现了很多伪影。这是因为你的x坐标范围从-8到8,而y坐标范围从约300到约2500。插值算法试图使事物各向同性,而你可能希望进行高度各向异性的插值(这样在绘制网格时看起来各向同性)。
为了纠正这个问题,你需要创建一个新的坐标系统来进行插值。没有一种正确的方法来做这件事。下面我使用的方法可以工作,但是“最好”的方式取决于你的数据实际代表什么。
换句话说,根据你对数据所测量系统的了解来决定如何处理它。这在插值中始终是真实的!除非你知道结果应该是什么样子,并且对插值算法足够熟悉,能够利用先验信息获得优势,否则不应进行插值!默认情况下,griddata使用的Delaunay三角插值算法也有比它更灵活的插值算法,但对于简单的示例来说,它已经足够了...
无论如何,一种方法是重新调整x和y坐标的比例,使它们大致处于相同的数量级。在这种情况下,我们将把它们重新调整为从0到1的范围内...(请原谅这段代码看起来有点混乱...我只是想用这个作为一个例子...)
def normalize_x(data):
data = data.astype(np.float)
return (data - xmin) / (xmax - xmin)
def normalize_y(data):
data = data.astype(np.float)
return (data - ymin) / (ymax - ymin)
x_new, xi_new = normalize_x(x), normalize_x(xi)
y_new, yi_new = normalize_y(y), normalize_y(yi)
zi = griddata( (x_new, y_new), z, (xi_new, yi_new) )
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()
![Data interpolated in a normalized coordinate system](https://istack.dev59.com/ihm3i.webp)
希望这能有所帮助,无论如何... 对回答的长度感到抱歉!
ValueError: x,y must be equal length 1-D arrays
的错误。我正在从Enthought发行版中运行matplotlib v0.99.3。您能否修复示例以重现NaN,并在可能的情况下包括有关计算所需输入/输出的更多信息,也许可以用图表说明? - dtlussier