python - python对不规则(x,y,z)网格的4D插值

标签 python numpy 3d scipy interpolation

我有一些数据以 (x, y, z, V) 的形式出现,其中 x,y,z 是距离,V 是湿度。我在 StackOverflow 上阅读了很多关于 python 插值的信息,例如 thisthis有值(value)的帖子,但它们都是关于 x, y, z 的规则网格。即,x 的每个值对 y 的每个点和 z 的每个点的贡献相等。另一方面,我的观点来自 3D 有限元网格(如下所示),其中网格不规则。

enter image description here

提到的两个帖子 12 , 将 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]]

我想得到点(25, 20, -30)的插值V

我怎样才能得到它?

最佳答案

为了 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

希望这对每个人都有好处。

下注问候

关于python - python对不规则(x,y,z)网格的4D插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47900969/

相关文章:

python - Tkinter/Matplotlib 后端冲突导致无限主循环

python - 字符串反转只反转一半的字符串

python - Numpy + Python 比 MATLAB 慢 15 倍?

python - Project Euler #101 - 如何解决 numpy 多项式溢出问题?

python - 如何,在 Python PYGtk GUI 中,只使用一次 pkexec 然后成为特定命令的 root

python - 在 PyInstaller 中,为什么 NumPy.Random.Common 不能作为模块加载?

python - 如何将升序连续数字标记到列中的值上?

用于存储 3 维 float 的 C++ 数据结构

javascript - 在使用 pdf.js 渲染的 Canvas 上平移 pdf 文件时出现问题?

python - 我如何将矢量投影到由 Python 中的正交矢量定义的平面上?