我有一个长度为 n 的id号的主数组,它适用于其他模拟数组,并且我的模拟中的元素的相应数据属于那些id号(例如data[id]
)。我是分别生成一个长度为 m 的id号列表,需要data
数组中有关这些id的信息,获取索引列表的最佳方法是什么{{1原始数组的id,以便提取idx
?那就是:
data[idx]
我想生成
a=numpy.array([1,3,4,5,6]) # master array
b=numpy.array([3,4,3,6,4,1,5]) # secondary array
数组idx=numpy.array([1,2,1,4,2,0,3])
通常按顺序排列,但不是必需的。此外,数组a
肯定会重复,并且不会以任何顺序排列。
我目前的做法是:
b
我使用以下测试计时:
idx=numpy.array([numpy.where(a==bi)[0][0] for bi in b])
有更好的方法吗?
答案 0 :(得分:1)
目前您正在使用每次搜索整个数组的方式。您可以使用dict进行查找O(1)而不是O(N)。例如,我使用以下方法:
def method2(a,b):
tmpdict = dict(zip(a,range(len(a))))
idx = numpy.array([tmpdict[bi] for bi in b])
并获得了非常大的加速,这对于更大的阵列来说会更好。对于示例代码中的大小,我的速度提高了15倍。我的代码唯一的问题是,如果a
中有重复的元素,那么dict将指向元素的最后一个实例,而使用您的方法时,它将指向第一个实例。但是,如果在代码的实际使用中存在重复元素,则可以解决这个问题。
答案 1 :(得分:0)
我不确定是否有办法在python中自动执行此操作,但您可能最好对两个数组进行排序,然后通过b
一次生成输出。该操作的复杂性应为O(|a|*log|a|)+O(|b|*log|b|)+O(|b|) = O(|b|*log|b|)
(假设|b| > |a|
)。我相信您的原始版本具有复杂度O(|a|*|b|)
,因此这应该为足够大的b
提供明显的改进。