Python 使用Numpy数组作为查找表

Python 使用Numpy数组作为查找表,python,numpy,Python,Numpy,我有一个从.csv文件读取的Numpy数据的2D数组。每一行代表一个数据点,最后一列包含一个“键”,它唯一地对应于另一个Numpy数组中的“键”——实际上是“查找表” 将第一个表中的行与第二个表中的值进行匹配的最佳方法是什么?一些示例数据: import numpy as np lookup = np.array([[ 1. , 3.14 , 4.14 ], [ 2. , 2.71818, 3.7 ],

我有一个从.csv文件读取的Numpy数据的2D数组。每一行代表一个数据点,最后一列包含一个“键”,它唯一地对应于另一个Numpy数组中的“键”——实际上是“查找表”

将第一个表中的行与第二个表中的值进行匹配的最佳方法是什么?

一些示例数据:

import numpy as np

lookup = np.array([[  1.     ,   3.14   ,   4.14   ],
                   [  2.     ,   2.71818,   3.7    ],
                   [  3.     ,  42.     ,  43.     ]])

a = np.array([[ 1, 11],
              [ 1, 12],
              [ 2, 21],
              [ 3, 31]])
在查找表中从键到行号构建字典:

mapping = dict(zip(lookup[:,0], range(len(lookup))))
然后你可以使用字典来匹配行。例如,如果您只想加入表:

>>> np.hstack((a, np.array([lookup[mapping[key],1:] 
                            for key in a[:,0]])))
array([[  1.     ,  11.     ,   3.14   ,   4.14   ],
       [  1.     ,  12.     ,   3.14   ,   4.14   ],
       [  2.     ,  21.     ,   2.71818,   3.7    ],
       [  3.     ,  31.     ,  42.     ,  43.     ]])    

在可以从键计算索引的特殊情况下,可以避免使用字典。当可以选择查找表的键时,这是一个优势

对于Vebjorn Ljosa的例子:

查找:

>>> lookup[a[:,0]-1, :]
array([[  1.     ,   3.14   ,   4.14   ],
       [  1.     ,   3.14   ,   4.14   ],
       [  2.     ,   2.71818,   3.7    ],
       [  3.     ,  42.     ,  43.     ]])
合并:

>>> np.hstack([a, lookup[a[:,0]-1, :]])
array([[  1.     ,  11.     ,   1.     ,   3.14   ,   4.14   ],
       [  1.     ,  12.     ,   1.     ,   3.14   ,   4.14   ],
       [  2.     ,  21.     ,   2.     ,   2.71818,   3.7    ],
       [  3.     ,  31.     ,   3.     ,  42.     ,  43.     ]])

+1从Alex Martelli获得+1;)当然,还有一个有用的答案。不管它值多少钱,都有一个内置的numpy函数来实现这一点:
numpy.lib.recfunctions.join_by
。但是,如果您还没有使用结构化数组,那么它就相当笨重了。有人能给我解释一下这部分的具体功能吗
np.array([lookup[mapping[key],1:]表示a[:,0]])
@Carl,它从
a
的第一列获取每个键,并在
lookup
数组中查找匹配行。然后它生成这些行的数组,省略第一列(键),这很有意义。感谢您的解释。使用查找
dict
的答案很酷,但是对于大型查找表来说,它非常无效。如果要“查找”值,可以使用
np.interp
xp
作为查找键,使用
fp
作为值(我想必须是浮动…)。通过这种方式,查找是在本机
numpy
中完成的,而不是python迭代(假设您希望通过查找表放置一个大图像,例如应用颜色映射)。