首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查numpy数组中的每个元素是否都在另一个数组中

检查numpy数组中的每个元素是否都在另一个数组中
EN

Stack Overflow用户
提问于 2013-04-11 10:34:29
回答 4查看 18.2K关注 0票数 25

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

所以,如果

代码语言:javascript
复制
A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6])

目前我正在使用

代码语言:javascript
复制
C = np.searchsorted(A,B)

它利用了A是有序的这一事实,并给出了[1, 3, 5],即A中元素的索引。这很好,但是如何获得D = [0,2,4,6],即A中不在B中的元素的索引

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-11 10:40:27

代码语言:javascript
复制
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])
票数 7
EN

Stack Overflow用户

发布于 2013-04-11 11:51:42

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

代码语言:javascript
复制
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]

输出为:

代码语言:javascript
复制
[1 3 5]
[0 2 4 6]

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

代码语言:javascript
复制
import pandas as pd
np.where(pd.Index(pd.unique(B)).get_indexer(A) >= 0)[0]

下面是时间对比:

代码语言:javascript
复制
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]

输出:

代码语言:javascript
复制
100 loops, best of 3: 2.09 ms per loop
1000 loops, best of 3: 594 µs per loop
票数 39
EN

Stack Overflow用户

发布于 2013-04-11 10:48:04

代码语言:javascript
复制
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])
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15939748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档