使用numpy.in1d()与数组及其单个元素的结果不同

时间:2013-03-20 03:25:17

标签: python numpy

我正在用Python编写代码,但我遇到了一些问题。我有两个数组,比如A和B,它们都包含ID。 A具有所有ID,B具有属于组的ID。我要做的是使用代码获取B中元素的位置:

>>> print B
[11600813 11600877 11600941 ..., 13432165 13432229 13434277]
>>> mask=np.nonzero(np.in1d(A, B))
>>> print A[mask]
[12966245 12993389 12665837 ..., 13091877 12965029 13091813]

但这显然是错误的,因为我没有恢复B的值。检查我是否正确使用numpy.in1d(),我试过了:

>>> mask=np.nonzero(np.in1d(A, B[0]))
>>> print A[mask]
[11600813]

这是对的,所以我猜测numpy.in1d()中的'B'存在问题。我尝试直接使用布尔np.in1d(A, B)而不是将其转换为索引,但它不起作用。我也尝试使用B = numpy.array(B)B = list(B),但没有一个有效。

但如果我执行B = numpy.array(B)[0]B = list(B)[0]它仍适用于该元素。不幸的是,我不能为每个元素执行'for'循环,因为len(A)是16777216而len(B)是9166所以这需要花费很多时间。

我还确保B的所有元素都在A:

>>> np.intersect1d(A, B)
[11600813 11600877 11600941 ..., 13432165 13432229 13434277]

1 个答案:

答案 0 :(得分:2)

您可以使用numpy.argsortnumpy.searchsorted来获取职位:

import numpy as np
A = np.unique(np.random.randint(0, 100, 100))
B = np.random.choice(A, 10)

idxA = np.argsort(A)
sortedA = A[idxA]
idxB = np.searchsorted(sortedA, B)
pos = idxA[idxB]
print A[pos]
print B

如果您想要更快的方法,请考虑使用pandas。

import pandas as pd
s = pd.Index(A)
pos = s.get_indexer(B)
print A[pos]
print B