根据另外两个数组中公共值的索引从数组返回值

时间:2015-04-14 15:32:34

标签: python arrays performance python-2.7 numpy

import numpy as np

a=np.random.randint(0,200,100)#rand int array
b1=np.random.randint(0,100,50)
b2=b1**3
c=[]

我有一个问题我认为应该很容易但找不到解决方案,我想在两个数组中找到匹配的值,然后使用其中一个的索引在另一个数组中查找值

for i in range(len(a)):
    for j in range(len(b1)):
         if b1[j]==a[i]:
             c.append(b2[j])

c=np.asarray(c)

显然上面的方法确实有效,但它很慢,这只是一个例子,在我实际做的工作中 a,b1,b2 都是超过10,000个元素。

更快的解决方案?

2 个答案:

答案 0 :(得分:6)

np.in1d(b1, a)返回一个布尔数组,指示b1中是否找到a的每个元素。

如果您希望获得b2中与ab1中的常用值索引相对应的值,则可以使用布尔数组来索引b2

b2[np.in1d(b1, a)]

使用此函数的速度要快得多,因为for循环被推到了NumPy的内部例程的水平。

答案 1 :(得分:1)

您可以使用numpy.intersect1d获取1d数组之间的交集。 注意当您找到交叉点时,您不需要索引或使用它们再次找到自己 !!!

>>> a=np.random.randint(0,200,100)
>>> b1=np.random.randint(0,100,50)
>>> 
>>> np.intersect1d(b1,a)
array([ 3,  9, 17, 19, 22, 23, 37, 53, 55, 58, 67, 85, 93, 94])

您可能会注意到使用intersection是一种更有效的方式,对于a[np.in1d(a, b1)]除了调用in1d函数之外,python还需要进行额外的索引,为了更好地理解,请参阅以下内容基准:

import numpy as np
s1="""
import numpy as np
a=np.random.randint(0,200,100)
b1=np.random.randint(0,100,50)
np.intersect1d(b1,a)
"""
s2="""
import numpy as np
a=np.random.randint(0,200,100)
b1=np.random.randint(0,100,50)
a[np.in1d(a, b1)]
    """


print ' first: ' ,timeit(stmt=s1, number=100000)
print 'second : ',timeit(stmt=s2, number=100000)

结果:

 first:  3.69082999229
second :  7.77609300613