使用Numpy数组作为查找表
我有一个从.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. ]])