我有一些数据以
(x, y, z, V)
的形式出现,其中 x、y、z 是距离,V 是湿度。我在 StackOverflow 上阅读了很多关于 python 插值的内容,例如 this 和 this 有价值的帖子,但它们都是关于 x, y, z
的规则网格。即 x
的每个值对 y
的每个点和 z
的每个点的贡献相等。另一方面,我的观点来自 3D 有限元网格(如下所示),其中网格不规则。
提到的两个帖子 1 和 2,将 x、y、z 中的每一个定义为单独的 numpy 数组,然后他们使用类似
cartcoord = zip(x, y)
然后 scipy.interpolate.LinearNDInterpolator(cartcoord, z)
的东西(在 3D 示例中)。我不能做同样的事情,因为我的 3D 网格不规则,因此不是每个点都对其他点有贡献,所以如果我重复这些方法时我发现很多空值,并且我得到很多错误。
这里有10个样本点,形式为
[x, y, z, V]
data = [[27.827, 18.530, -30.417, 0.205] , [24.002, 17.759, -24.782, 0.197] ,
[22.145, 13.687, -33.282, 0.204] , [17.627, 18.224, -25.197, 0.197] ,
[29.018, 18.841, -38.761, 0.212] , [24.834, 20.538, -33.012, 0.208] ,
[26.232, 22.327, -27.735, 0.204] , [23.017, 23.037, -29.230, 0.205] ,
[28.761, 21.565, -31.586, 0.211] , [26.263, 23.686, -32.766, 0.215]]
我想得到点的插值
V
(25, 20, -30)
我怎样才能得到它?
我找到了答案,为了 StackOverflow 读者的利益而发布它。
方法如下:
1-进口:
import numpy as np
from scipy.interpolate import griddata
from scipy.interpolate import LinearNDInterpolator
2-准备数据如下:
# put the available x,y,z data as a numpy array
points = np.array([
[ 27.827, 18.53 , -30.417], [ 24.002, 17.759, -24.782],
[ 22.145, 13.687, -33.282], [ 17.627, 18.224, -25.197],
[ 29.018, 18.841, -38.761], [ 24.834, 20.538, -33.012],
[ 26.232, 22.327, -27.735], [ 23.017, 23.037, -29.23 ],
[ 28.761, 21.565, -31.586], [ 26.263, 23.686, -32.766]])
# and put the moisture corresponding data values in a separate array:
values = np.array([0.205, 0.197, 0.204, 0.197, 0.212,
0.208, 0.204, 0.205, 0.211, 0.215])
# Finally, put the desired point/points you want to interpolate over
request = np.array([[25, 20, -30], [27, 20, -32]])
3- 编写最后一行代码以获取插值
方法一,使用
griddata
print griddata(points, values, request)
# OUTPUT: array([ 0.20448536, 0.20782028])
方法二,使用
LinearNDInterpolator
# First, define an interpolator function
linInter= LinearNDInterpolator(points, values)
# Then, apply the function to one or more points
print linInter(np.array([[25, 20, -30]]))
print linInter(request)
# OUTPUT: [0.20448536 0.20782028]
# I think you may use it with python map or pandas.apply as well
希望这对每个人都有好处。
赌注问候
我假设你有大量的数据点,我还假设你会遇到网格数据生成结果非常慢的情况。在你的案例中有没有办法加快插值速度?
作为参考,我在不规则的 3D 网格上有大约 100,000 个数据点,每次迭代大约需要 10 分钟才能生成。