1

我正在用 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]

这是正确的,所以我猜 'B' in 有问题numpy.in1d()。我尝试直接使用布尔值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]
4

1 回答 1

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
于 2013-03-20T03:42:35.483 回答