通过python对不规则(x,y,z)网格进行4D插值 [英] 4D interpolation for irregular (x,y,z) grids by python

查看:97
本文介绍了通过python对不规则(x,y,z)网格进行4D插值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have some data that comes in the form (x, y, z, V) where x,y,z are distances, and V is the moisture. I read a lot on StackOverflow about interpolation by python like this and this valuable posts, but all of them were about regular grids of x, y, z. i.e. every value of x contributes equally with every point of y, and every point of z. On the other hand, my points came from 3D finite element grid (as below), where the grid is not regular.

提到的两个帖子 1 2 ,将x,y,z中的每个定义为单独的numpy数组,然后他们使用了一些东西例如cartcoord = zip(x, y),然后是scipy.interpolate.LinearNDInterpolator(cartcoord, z)(在3D示例中).我不能做同样的事情,因为我的3D网格不是规则的,因此不是每个点都对其他点有贡献,因此,如果我重复这些方法,则会发现许多空值,并且会出现很多错误.

The two mentioned posts 1 and 2, defined each of x, y, z as a separate numpy array then they used something like cartcoord = zip(x, y) then scipy.interpolate.LinearNDInterpolator(cartcoord, z) (in a 3D example). I can not do the same as my 3D grid is not regular, thus not each point has a contribution to other points, so if when I repeated these approaches I found many null values, and I got many errors.

以下是[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)

我怎么得到它?

推荐答案

我找到了答案,并将其发布给了StackOverflow读者.

I found the answer, and posting it for the benefit of StackOverflow readers.

方法如下:

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-编写代码的最后一行以获取插值

3- Write the final line of code to get the interpolated values

方法1 ,使用griddata

print griddata(points, values, request)
# OUTPUT: array([ 0.20448536, 0.20782028])

方法2 ,使用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对不规则(x,y,z)网格进行4D插值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆