python中2个列表的3D插值

时间:2015-03-18 13:32:09

标签: python list interpolation

嗨我从两个单独的导入文件中获取了两组数据,这些数据都被导入到python中,并被放置在两个单独的列表中,如下所示:

列表1的格式为:

(node, x coordinate, y coordinate, z coordinate)
example list 1: [[1,0,0,0],[2,1,0,0],[3,0,1,0],[4,1,1,0],[5,0,0,1],[6,1,0,1],[7,0,1,1],[8,1,1,1]]

列表2的格式为:

(x coordinate, y coordinate, z coordinate, temperature)
example list 2: [[0,0,0,100],[1,0,0,90],[0,1,0,85],[1,1,0,110],[0,0,1,115],[1,0,1,118],[0,1,1,100],[1,1,11,96]]

从这两个列表中我需要使用坐标来创建第三个列表,其中包含节点值及其对应的温度。如果所有x y和z坐标都匹配,则此任务是一个简单的字典函数,但是我正在使用的数据并非总是如此。

例如,如果在列表1中,我在列表的末尾添加一个新条目,节点号9;

new entry at end of list 1 [9, 0.5, 0.9, 0.25]

现在我发现自己的节点号没有相应的温度。此时,需要在列表2上执行插值功能,以便为我提供与此节点相关的温度。通过基本的3d插值计算,我得出这个温度为97.9,因此我的最终输出列表如下所示:

输出列表:

(node, temperature)
Output list: [[1,100],[2,90],[3,85],[4,110],[5,115],[6,118],[7,100],[8,96],[9,97.9]]

我是python的新手,所以我很难找到这个插值问题的解决方案,我一直在研究如何这样做几周,但仍然无法找到解决方案。

任何帮助都会非常非常赞赏,

由于

2 个答案:

答案 0 :(得分:1)

在scipy中有很多插值例程,但是在2维以上,大多数只提供线性和最近邻插值 - 这可能不足以供你使用。

所有插值编程都列在scipy docs区域的interplation页面上。直接你可以忽略mnivariate,1D和2D样条曲线部分 - 你想要multivariate部分。

这里有9个功能,分为结构化和非结构化数据:

  

非结构化数据:

     

griddata(points, values, xi[, method, ...])插入非结构化的   D维数据。

     

LinearNDInterpolator(points, values[, ...]) N维的分段线性插值。

     

NearestNDInterpolator(points, values) N维中的最近邻插值。

     

CloughTocher2DInterpolator(points, values[, tol])分段立方,C1平滑,曲率最小化的二维插值。

     

Rbf(*args)用于径向基函数近似/ n维散乱数据插值的类。

     

interp2d(x, y, z[, kind, copy, ...])插入二维网格。对于>

     

网格上的数据:

     

interpn(points, values, xi[, method, ...])多维   常规网格上的插值。

     

RegularGridInterpolator(points, values[, ...])在任意维度的规则网格上插值

     

RectBivariateSpline(x, y, z[, bbox, kx, ky, s])矩形网格上的双变量样条近似。

另外还有一个参见部分,但我们会忽略它。

你应该阅读它们各自的工作方式,这可能有助于你更好地理解。

这些函数的工作方式是,你传递数据,即x,y,z坐标,以及这些点的相应值,然后它们返回一个允许你在任何位置得到一个点的函数。 / p>

我会在这里推荐Rbf函数,因为我可以看到它是唯一一个不限制线性或最近邻插值的nD选项。

例如,您有两个列表:

node_locations = [(node, x_coord, y_coord, z_coord), ...]
temp_data = [(x0, y0, z0, temp0), (x1, y1, z1, temp1), ...]

xs, ys, zs, temps = zip(*teemp_data) # This will unpack your data into columns, rather than rows.

from scipy.interpolate import Rbf
rbfi = Rbf(xs, ys, zs, temps)

# I don't know how you want your output data, so i'm just dumping it in a dictionary.    
node_data = {}
for node, x, y, z in node_locations:
  node_data[node] = rbfi(x, y, z)

尝试类似的东西。

答案 1 :(得分:0)

对于科学计算,我不会使用列表而是使用numpy数组。

所以在你的情况下:

import numpy as np
nodes = np.array(example_list_1)
temperatures = np.array(example_list_2)

然后,您可以继续使用scipy的插值函数,例如: http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html#scipy.interpolate.griddata

from scipy.interpolate import griddata
interpolated = griddata(temperatures[:, :-1], 
                         temperatures[:, -1], 
                         nodes[:, 1:])