我试图将一组点(下图中的紫色点)转换为插值网格时引用this question和this documentation。
正如您所看到的,图像中缺少点应该的点。我想知道它们在哪里。
import numpy as np
from scipy import interpolate
CIRCLES_X = 25 # There should be 25 circles going across
CIRCLES_Y = 10 # There should be 10 circles going down
points = []
values = []
# Points range from 0-800 ish X, 0-300 ish Y
for point in points:
points.append([points.x, points.y])
values.append(1) # Not sure what this should be
grid_x, grid_y = np.mgrid[0:CIRCLES_Y, 0:CIRCLES_X]
grid = interpolate.griddata(points, values, (grid_x, grid_y), method='linear')
print(grid)
每当我打印出网格的结果时,我的所有值都会得到nan
。
我哪里错了?我的问题甚至是interpolate.grid
的正确用例吗?
答案 0 :(得分:1)
首先,你的不确定点主要在边缘,所以它实际上是extrapolation。其次,scipy
中内置的插值方法处理在整个平面上定义的连续函数,并将其近似为多项式。虽然你的是离散的(1或0),有些是周期性的而不是多项式的,只是在一个离散的"网格中定义的#34;分数。
所以你必须发明一些算法来/推断你的特定功能。您是否能够重复使用现有的 - 来自scipy
或其他地方 - 取决于您。
一种可能的方法是替换它用一些函数(连续或不连续)定义,然后计算缺失点的近似值 - 是否作为scipy.interpolate
的一步非类函数执行或作为两个单独的步骤。
e.g。你可以使用一个三维抛物线,它的点和波峰恰好在它们之间。或者只是在点中的那些和空白中的0并且希望在网格点中得到的近似值足以给出有意义的结果(可能随机过量)。然后,您可以使用scipy.interpolate.RegularGridInterpolator
进行插值和外推。
或作为和声功能 - 那么你所寻求的是Fourier transformation
另一种可能的方法是直接寻求一个离散的解决方案,而不是试图扼杀持续的数据分析。你的案例中的方法:设计一个(可能是完全自定义的)算法,该算法试图找出"形状"和"尺寸"您的"点网格#34;然后只需填写空白。我不确定是否可以将其作为可选算法添加到scipy.interpolate
的线束中,除了内置的算法之外。
最后但并非最不重要。 您没有说明"是否缺少"点是值未知的点或数据的实际部分 - 即数据不正确。如果是后者,简单插值根本不适用,因为它假定所有数据都是严格的正确。然后它是一个相关但又不同的问题:你可以近似数据,但必须以某种方式"扔掉违规行为" (某些点之后小的实体的更高阶)。