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

Python 使用scipy.interpolate.griddata时,如何设置插值点之间的最大距离?,python,matplotlib,scipy,Python,Matplotlib,Scipy,我有一组带有Z值的空间数据,我想使用一些matplotlib或scipy模块进行插值。我的XY点有一个凹面形状,我不希望在空区域中插入值。有没有一种方法可以让用户轻松地设置点之间的最大距离,以避免在空区域内插值?我也遇到了同样的问题,并通过重新使用scipy本身用于最近邻插值的kd树实现找到了解决办法,用kd树查询结果的结果屏蔽插值结果数组 考虑下面的示例代码: import numpy as np import scipy.interpolate import matplotlib.pyplo

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

我也遇到了同样的问题,并通过重新使用scipy本身用于最近邻插值的kd树实现找到了解决办法,用kd树查询结果的结果屏蔽插值结果数组

考虑下面的示例代码:

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()


我意识到这可能不是你想要的视觉效果。特别是如果数据集不是很密集,则需要有一个较高的距离阈值,以便不掩盖合法插值的数据。如果您的数据足够密集,您可能能够以相对较小的半径离开,或者想出一个更智能的截止函数。希望这有帮助。

为了运行代码的第二部分,我需要替换:
xi=\u ndim\u coords\u from_数组(tuple(grid),ndim=xy.shape[1])
为:
xi=\u ndim\u coords\u from_数组(tuple(grid))
我还有一个类似的问题。这种方法使早期的作品很有魅力。但是,如果线性插值不是绝对需要的,则可以选择“最近”插值并轻松避免间隙。
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()