我从两个单独的导入文件中获取了两组数据,这两个导入文件都被导入到python中,并且当前已经放入列表中,如下所示。
列表1的格式为:
(参考编号,x坐标,y坐标)
示例列表1:[[1,0,0],[2,0,10],[3,0,20],[4,0,30],[5,0,40]]
列表2的格式为:
(x坐标,y坐标,温度)
示例列表2:[[0,0,100],[0,10,110],[0,20,120],[0,30,130],[0,40,140]]
我需要使用x和y坐标比较两个列表,如果找到匹配,则会生成一个包含相应参考编号和温度的新列表。
例如,从输出列表上方的两个列表开始,将遵循以下形式:
(参考编号,温度)
示例输出列表:[[1,100],[2,11],[3,120],[4,130],[5,140]]
字典函数不起作用,因为我需要能够插入列表2, 例如,如果列表1中的参考编号3,我也改变了坐标:
(参考编号,x坐标,y坐标)= [3,0,25]
列表2中最接近的两个温度值将是120和130.因此我预期的输出将是[3,125]
我知道这很复杂。
谢谢你提前给我任何帮助我可以给予这个我相信使用numpy和scipy.interpolate使用rbf可能涉及但目前无法为自己找到解决方案。
干杯
答案 0 :(得分:0)
我在等你表现出一些主动性,但我无法帮助自己,所以我想出了以下内容,这可能不是最佳选择。为了达到这个解决方案,我
scipy.interpolate.interp2d
我稍微扩展了你的数据:
ref = [[1, 0, 0], [2, 0, 10], [3, 0, 20], [4, 0, 30],
[5, 0, 40], [6, 0, 25], [7, 1, 5], [8, 2, 15], [9, 2, 1]]
temp = [[0, 0, 100], [0, 10, 110], [0, 20, 120], [0, 30, 130], [0, 40, 140],
[1, 0, 105], [1, 10, 115], [1, 20, 125], [1, 30, 135], [1, 40, 145],
[2, 20, 145],
[3, 0, 150], [3, 10, 160], [3, 20, 170], [3, 30, 180], [3, 40, 190]]
一些助手(我喜欢使用operator.itemgetter
)
import operator, scipy
temp_coord = operator.itemgetter(0,1)
temp_value = operator.itemgetter(2)
将x,y和z数据与测量值分开:
x_coords, y_coords = zip(*(temp_coord(thing) for thing in temp))
z = [temp_value(thing) for thing in temp]
scipy.interpolate.interp2d
返回一个函数,该函数将返回任何x,y坐标的插值。
f = scipy.interpolate.interp2d(x_coords, y_coords, z, kind='linear')
for r, x, y in ref:
print 'ref:{}\ttemp{}'.format(r, f(x,y))
结果
>>>
ref:1 temp[ 100.]
ref:2 temp[ 110.]
ref:3 temp[ 120.]
ref:4 temp[ 130.]
ref:5 temp[ 140.]
ref:6 temp[ 125.]
ref:7 temp[ 110.]
ref:8 temp[ 107.84726776]
ref:9 temp[ 11.21260262]
>>>
如果有大量缺失数据,您将收到错误的结果。这可以通过参考点8和9看出。数据域之外的坐标也可能产生错误的值。