使用scipy.interpolate.griddata时如何设置插值点之间的最大距离?

gre*_*goo 6 python matplotlib scipy

我有一个Z值的空间数据集,我想使用一些matplotlib或scipy模块进行插值。我的XY点具有凹形形状,并且我不想在空白区域中插入值。有没有一种方法可以让用户轻松设置点之间的最大距离,从而避免在空白区域内插值?

use*_*435 6

我在同一个问题上苦苦挣扎,并通过重新使用scipy本身用于最近邻居插值的kd-tree实现,并用kd-tree查询结果的结果掩盖了插值结果数组,找到了解决方法。

考虑下面的示例代码:

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

# Generate some random data
xy = np.random.random((2**15, 2))
z = np.sin(10*xy[:,0]) * np.cos(10*xy[:,1])

grid = np.meshgrid(
    np.linspace(0, 1, 512),
    np.linspace(0, 1, 512)
)

# Interpolate
result1 = scipy.interpolate.griddata(xy, z, tuple(grid), 'linear')

# Show
plt.figimage(result1)
plt.show()

# Remove rectangular window
mask = np.logical_and.reduce((xy[:,0] > 0.2, xy[:,0] < 0.8, xy[:,1] > 0.2, xy[:,1] < 0.8))
xy, z = xy[~mask], z[~mask]

# Interpolate
result2 = scipy.interpolate.griddata(xy, z, tuple(grid), 'linear')

# Show
plt.figimage(result2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这将生成以下两个图像。由于数据中心缺少矩形窗口,因此注意到较强的插值伪像。

原始数据 缺失数据

现在,如果我们在相同的示例数据上运行以下代码,将获得以下图像。

THRESHOLD = 0.01

from scipy.interpolate.interpnd import _ndim_coords_from_arrays
from scipy.spatial import cKDTree

# Construct kd-tree, functionality copied from scipy.interpolate
tree = cKDTree(xy)
xi = _ndim_coords_from_arrays(tuple(grid), ndim=xy.shape[1])
dists, indexes = tree.query(xi)

# Copy original result but mask missing values with NaNs
result3 = result2[:]
result3[dists > THRESHOLD] = np.nan

# Show
plt.figimage(result3)
plt.show()
Run Code Online (Sandbox Code Playgroud)

掩盖结果

我意识到这可能并不是您所追求的视觉效果。特别是如果您的数据集不是很密集,则需要具有较高的距离阈值,以免合法插值的数据被屏蔽。如果您的数据足够密集,则可以以相对较小的半径逃脱,或者可以使用更智能的截止功能。希望能有所帮助。