我正在用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]
答案 0 :(得分:2)
您可以使用numpy.argsort
,numpy.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