我有一个从.csv文件中读取的Numpy数据的2D数组.每行代表一个数据点,最后一列包含一个'key',它唯一对应于另一个Numpy数组中的'key' - '查询表'.
将第一个表中的行与第二个表中的值匹配的最佳(最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]])
Run Code Online (Sandbox Code Playgroud)
在查找表中从键到行号构建字典:
mapping = dict(zip(lookup[:,0], range(len(lookup))))
Run Code Online (Sandbox Code Playgroud)
然后你可以使用字典来匹配线条.例如,如果您只想加入表格:
>>> 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. ]])
Run Code Online (Sandbox Code Playgroud)
在可以根据键计算索引的特殊情况下,可以避免使用字典。当可以选择查找表的键时这是一个优点。
对于 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. ]])
Run Code Online (Sandbox Code Playgroud)
合并:
>>> 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. ]])
Run Code Online (Sandbox Code Playgroud)