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

1 投票
1 回答
1625 浏览
提问于 2025-04-17 19:42

我正在用Python写代码,但遇到了一些问题。我有两个数组,假设叫做A和B,里面都是一些ID。A包含了所有的ID,而B则是属于某个组的ID。我想做的是找出B中的元素在A中的位置,使用的代码是:

>>> 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 个回答

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

撰写回答