我试图使用另一个数组中的“键”在一个数组中查找值。不幸的是,由于键的“空间”太大(但稀疏),我无法将其转换为索引技巧(通过使用数组作为索引)。
我发现了一个“未公开记录”的功能np.lib.recfunctions.join_by
,它或多或少地允许我通过“键”而不是索引进行选择,这是一个示例:
import numpy as np
from numpy.lib import recfunctions # necessary!
>>> a = np.array([100,200,500,700,200,500,100,700,200], dtype=[('key','i')])
array([(100,), (200,), (500,), (700,), (200,), (500,), (100,), (700,),
(200,)], dtype=[('key', '<i4')])
>>> b = np.array([(100,10),(200,20),(500,50),(700,70)], dtype=[('key','i'),('value','i')])
array([(100, 10), (200, 20), (500, 50), (700, 70)],
dtype=[('key', '<i4'), ('value', '<i4')])
>>> np.lib.recfunctions.join_by('key', a, b, usemask=False)
array([(100, 10), (200, 20), (200, 999999), (500, 50),
(500, 999999), (500, 999999), (700, 70), (700, 999999),
(700, 999999)], dtype=[('key', '<i4'), ('value', '<i4')])
事实证明,此功能不支持重复的“键”。我想知道如何得到这样的结果
array([(100,10),(200,20),(500,50),(700,70),(200,20),(500,50),(100,10)...])
恰好遵循a
的顺序并具有额外的查找结果列。任何帮助表示赞赏!
答案 0 :(得分:0)
我发现我可以将所有可能的键重新映射到索引。对于上述a
和b
,假设b
已排序,我可以使用
indexOfAInB = np.unique(np.r_[a['key'],b['key']], return_inverse=True)[1][:len(a)]
获取映射。然后,我可以使用索引技巧:
B['value'][indexOfAInB]
获得“查找结果”。
由于np.unique
在内部进行了排序,因此我相信这将花费O(nlogn)
的时间。尽管如此,任何关于更好方法的建议还是值得欢迎的!
顺便说一句,此方法不支持key
中的a
中的b