使用Numpy数组作为查找表

9 投票
2 回答
13850 浏览
提问于 2025-04-16 03:01

我有一个从.csv文件读取的二维数组,里面是Numpy的数据。每一行代表一个数据点,最后一列包含一个“键”,这个“键”在另一个Numpy数组中是唯一对应的,那个数组可以看作是“查找表”。

那么,最好的(最符合Numpy风格的)方法是什么,来把第一个表中的行和第二个表中的值匹配起来呢?

2 个回答

5

在某些特殊情况下,当我们可以通过键来计算索引时,就可以不使用字典。这在我们可以选择查找表的键时是一个好处。

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

这里有一些示例数据:

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

撰写回答