我有一个从.csv文件读取的Numpy数据的二维数组。每一行都代表一个数据点,最后一列包含一个'key',它唯一对应于另一个Numpy数组中的'key' - 'lookup table'。使用Numpy数组作为查找表
什么是最好的(最Numpythonic)方式来匹配第一个表中的行和第二个中的值?
我有一个从.csv文件读取的Numpy数据的二维数组。每一行都代表一个数据点,最后一列包含一个'key',它唯一对应于另一个Numpy数组中的'key' - 'lookup table'。使用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. ]])
+1,建立一个辅助字典显然是要走的路。 – 2010-08-19 15:25:52
+1从Alex Martelli获得+1;)当然,还有一个有用的答案。 – 2010-08-19 15:49:37
无论它值什么,都有一个内置的numpy函数来执行此操作:'numpy.lib.recfunctions.join_by'。 http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826尽管如此,如果你还没有使用结构化数组,它会非常笨重。 – 2010-08-19 15:53:26
在特殊情况下,可以通过键计算索引,避免使用字典。当查找表的关键字可以被选择时,这是一个优点。
对于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. ]])
的查找答案'dict'是很酷,但它是大的查找表非常无效。如果你想“查找”值,你可以使用带'xp'的'np.interp'作为你的查找键和'fp'作为你的值(我猜这肯定是浮点数)。这样,查找是用原生'numpy'完成的,而不是python迭代(例如,您想通过查找表放大图像,例如应用彩色图)。 – 2017-12-06 18:30:16