25

这个问题看起来很简单,但我无法得到一个好看的解决方案。我有两个 numpy 数组(A 和 B),我想获取 A 的索引,其中 A 的元素在 B 中,还获取 A 的索引,其中元素不在 B 中。

因此,如果

A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6])

目前我正在使用

C = np.searchsorted(A,B)

它利用了A有序的事实,并为我提供[1, 3, 5]了 中的元素的索引A。这很棒,但是我如何获得那些不在其中D = [0,2,4,6]的元素的索引?AB

4

4 回答 4

39

searchsorted如果不是 B 的每个元素都在 A 中,可能会给您错误的答案。您可以使用numpy.in1d

A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6,8])
mask = np.in1d(A, B)
print np.where(mask)[0]
print np.where(~mask)[0]

输出是:

[1 3 5]
[0 2 4 6]

但是in1d()使用排序,这对于大型数据集来说很慢。如果您的数据集很大,您可以使用 pandas:

import pandas as pd
np.where(pd.Index(pd.unique(B)).get_indexer(A) >= 0)[0]

下面是时间对比:

A = np.random.randint(0, 1000, 10000)
B = np.random.randint(0, 1000, 10000)

%timeit np.where(np.in1d(A, B))[0]
%timeit np.where(pd.Index(pd.unique(B)).get_indexer(A) >= 0)[0]

输出:

100 loops, best of 3: 2.09 ms per loop
1000 loops, best of 3: 594 µs per loop
于 2013-04-11T03:51:42.267 回答
7
import numpy as np

A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6])
C = np.searchsorted(A, B)

D = np.delete(np.arange(np.alen(A)), C)

D
#array([0, 2, 4, 6])
于 2013-04-11T02:40:26.727 回答
5
import numpy as np

a = np.array([1, 2, 3, 4, 5, 6, 7])
b = np.array([2, 4, 6])
c = np.searchsorted(a, b)
d = np.searchsorted(a, np.setdiff1d(a, b))

d
#array([0, 2, 4, 6])
于 2013-04-11T02:48:04.303 回答
5

A 中也在 B 中的元素:

设置(A)和设置(B)

A 中不在 B 中的元素:

集合(A) - 集合(B)

于 2017-05-11T15:22:39.480 回答