使用具有非唯一条目的辅助数组查找主数组中的索引列表

时间:2010-06-11 16:08:14

标签: python indexing numpy

我有一个长度为 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])

有更好的方法吗?

2 个答案:

答案 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提供明显的改进。