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个元素。
更快的解决方案?
答案 0 :(得分:6)
np.in1d(b1, a)
返回一个布尔数组,指示b1
中是否找到a
的每个元素。
如果您希望获得b2
中与a
和b1
中的常用值索引相对应的值,则可以使用布尔数组来索引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