Python 使用Numpy数组作为查找表
我有一个从.csv文件读取的Numpy数据的2D数组。每一行代表一个数据点,最后一列包含一个“键”,它唯一地对应于另一个Numpy数组中的“键”——实际上是“查找表” 将第一个表中的行与第二个表中的值进行匹配的最佳方法是什么?一些示例数据:Python 使用Numpy数组作为查找表,python,numpy,Python,Numpy,我有一个从.csv文件读取的Numpy数据的2D数组。每一行代表一个数据点,最后一列包含一个“键”,它唯一地对应于另一个Numpy数组中的“键”——实际上是“查找表” 将第一个表中的行与第二个表中的值进行匹配的最佳方法是什么?一些示例数据: import numpy as np lookup = np.array([[ 1. , 3.14 , 4.14 ], [ 2. , 2.71818, 3.7 ],
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. ]])
在可以从键计算索引的特殊情况下,可以避免使用字典。当可以选择查找表的键时,这是一个优势 对于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. ]])
+1从Alex Martelli获得+1;)当然,还有一个有用的答案。不管它值多少钱,都有一个内置的numpy函数来实现这一点:
numpy.lib.recfunctions.join_by
。但是,如果您还没有使用结构化数组,那么它就相当笨重了。有人能给我解释一下这部分的具体功能吗np.array([lookup[mapping[key],1:]表示a[:,0]])
@Carl,它从a
的第一列获取每个键,并在lookup
数组中查找匹配行。然后它生成这些行的数组,省略第一列(键),这很有意义。感谢您的解释。使用查找dict
的答案很酷,但是对于大型查找表来说,它非常无效。如果要“查找”值,可以使用np.interp
和xp
作为查找键,使用fp
作为值(我想必须是浮动…)。通过这种方式,查找是在本机numpy
中完成的,而不是python迭代(假设您希望通过查找表放置一个大图像,例如应用颜色映射)。