嗨我从两个单独的导入文件中获取了两组数据,这些数据都被导入到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的新手,所以我很难找到这个插值问题的解决方案,我一直在研究如何这样做几周,但仍然无法找到解决方案。
任何帮助都会非常非常赞赏,
由于
答案 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:])