使用Numpy数组作为查找表

时间:2010-08-19 14:47:18

标签: python numpy

我有一个从.csv文件读取的Numpy数据的2D数组。每行代表一个数据点,最后一列包含一个'key',它与另一个Numpy数组中的'key'唯一对应 - 就像'查找表'一样。

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

2 个答案:

答案 0 :(得分:8)

一些示例数据:

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

答案 1 :(得分:3)

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

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