比较python中的两个2​​D列表并插入不同的值

时间:2015-02-21 15:40:40

标签: python list numpy interpolation

我从两个单独的导入文件中获取了两组数据,这两个导入文件都被导入到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可能涉及但目前无法为自己找到解决方案。

干杯

1 个答案:

答案 0 :(得分:0)

我在等你表现出一些主动性,但我无法帮助自己,所以我想出了以下内容,这可能不是最佳选择。为了达到这个解决方案,我

  1. 浏览了scipy docs并找到了iterpolation模块
  2. 遵循scipy.interpolate.interp2d
  3. 的文档和示例

    我稍微扩展了你的数据:

    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看出。数据域之外的坐标也可能产生错误的值。