使用Numpy数组作为查找表


问题内容

我有一个从.csv文件读取的Numpy数据的2D数组。每行代表一个数据点,最后一列包含一个“键”,该键与另一个Numpy数组(即“查找表”)中的“键”唯一对应。

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


问题答案:

一些示例数据:

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.     ]])