将您的代码示例与问题的标题进行比较,我认为您有点困惑......
在您的示例代码中,您正在创建规则网格化随机数据,然后将其重新采样到另一个规则网格。您的示例中的任何地方都没有不规则数据......
(此外,代码不会按原样运行,您应该查看meshgrid http://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html而不是循环生成 x 和 y 网格。)
如果您想对已经定期采样的网格进行重新采样(就像在示例中所做的那样),有比 griddata 或我将在下面描述的任何方法更有效的方法。 (scipy.ndimage.map_coordinates https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.map_coordinates.html在这种情况下,将非常适合您的问题。)
然而,根据您的问题,听起来您想要将不规则间隔的数据插值到规则网格上。
在这种情况下,你可能会有这样的一些观点:
import numpy as np
import matplotlib.pyplot as plt
#import matplotlib.mlab as mlab # 2023 use instead:
from scipy.interpolate import griddata
# Bounds and number of the randomly generated data points
ndata = 20
xmin, xmax = -8, 8
ymin, ymax = 380, 2428
# Generate random data
x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)
# Plot the random data points
plt.scatter(x,y,c=z)
plt.axis([xmin, xmax, ymin, ymax])
plt.colorbar()
plt.show()
然后,您可以像之前一样插入数据...(继续上面的代码片段...)
# Size of regular grid
ny, nx = 512, 115
# Generate a regular grid to interpolate the data.
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
xi, yi = np.meshgrid(xi, yi)
# Interpolate using delaunay triangularization
#zi = mlab.griddata(x,y,z,xi,yi) # 2023 use instead:
zi = griddata( (x,y), z, (xi,yi) )
# Plot the results
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()
但是,您会注意到网格中出现了大量伪影。这是因为 x 坐标范围从 -8 到 8,而 y 坐标范围从 ~300 到 ~2500。插值算法试图使事物各向同性,而您可能需要高度各向异性插值(以便在绘制网格时呈现各向同性)。
为了纠正这个问题,您需要创建一个新的坐标系来进行插值。没有一种正确的方法可以做到这一点。我下面使用的方法是可行的,但“最佳”方法在很大程度上取决于您的数据实际代表的内容。
(换句话说,利用您对数据正在测量的系统的了解来决定如何做到这一点。这是always插值正确!你不应该插值,除非你知道结果应该是什么样子,并且足够熟悉插值算法,可以利用先验信息来发挥自己的优势!还有比 griddata 默认使用的 Delaunay 三角剖分更灵活的插值算法,但对于一个简单的例子来说这很好......)
无论如何,实现此目的的一种方法是重新缩放 x 和 y 坐标,使它们的范围大致相同。在这种情况下。我们将把它们从 0 重新缩放到 1...(原谅意大利面条字符串代码...我只是想以此作为一个例子...)
# (Continued from examples above...)
# Normalize coordinate system
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)
# Interpolate using delaunay triangularization
#zi = mlab.griddata(x_new, y_new, z, xi_new, yi_new) # 2023 use instead:
zi = griddata( (x_new, y_new), z, (xi_new, yi_new) )
# Plot the results
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()
无论如何,希望能有所帮助……抱歉,答案太长了!