找到两个数组中不相交的值

14

如果我有两个numpy数组,并且想要找到它们之间不相交的值,我该如何做?

这是一个简短的示例,说明我无法理解的问题。

a = ['Brian', 'Steve', 'Andrew', 'Craig']
b = ['Andrew','Steve']

我想找到无交集的值。在这种情况下,我希望我的输出结果是:

['Brian','Craig']

这样做的结果恰恰与我想要的相反:

c=np.intersect1d(a,b)

返回

['Andrew' 'Steve']
5个回答

21
你可以使用setxor1d。根据文档

找到两个数组的集合异或。
返回仅出现在输入数组之一(而不是两者)中的已排序、唯一值。

用法如下:

import numpy

a = ['Brian', 'Steve', 'Andrew', 'Craig']
b = ['Andrew','Steve']

c = numpy.setxor1d(a, b)

执行此代码将导致 c 变量的值为 array(['Brian', 'Craig'])


14

考虑到您问题中展示的对象都不是NumPy数组,因此您不需要使用NumPy来实现此操作:

c = list(set(a).symmetric_difference(b))

如果您需要作为输出的Numpy数组,那么创建一个非常简单:

c = np.array(set(a).symmetric_difference(b))

(这假定元素在 c 中出现的顺序不重要。如果重要,你需要说明期望的顺序。)

另外,也有一个纯 NumPy 的解决方案,但我个人觉得它很难阅读:

c = np.setdiff1d(np.union1d(a, b), np.intersect1d(a, b))

提问者标记了numpy这个问题,所以我认为应该解释一下为什么不直接使用numpy。 - simonzack
@simonzack:答案中已经有解释了(即:因为它不需要)。此外,答案明确提供了一种使用numpy数组构建结果的方法。 - NPE
1
@simonzack:当它可以使用numpy数组时,为什么你会关心一个正确的答案是否明确“使用”numpy? - jolvi
谢谢你们,所有的回答都非常有帮助。我的问题是没有在实际问题中使用numpy数组,这是我的错。抱歉。 - itjcms18

2
np.setdiff1d(a,b)

这将返回第一个参数与第二个参数不相交的值
例子:
a = [1,2,3]
b = [1,3]
np.setdiff1d(a,b)  -> returns [2]
np.setdiff1d(b,a)  -> returns []

0

这应该对Python数组有用

c=[x for x in a if x not in b]+[x for x in b if x not in a]

首先,它收集了所有不在b中的a元素,然后添加了所有不在a中的b元素。这样,您就可以获得所有在a或b中但不在两者中都存在的元素。


目前,此回答被列为低质量回答。也许您可以通过解释这段代码的作用来改进它(只需要简单说明即可!) - Andrew T.

-2
import numpy as np

a = np.array(['Brian', 'Steve', 'Andrew', 'Craig'])
b = np.array(['Andrew','Steve'])

你可以使用

set(a) - set(b)

输出:

set(['Brian', 'Craig'])

注意:set操作返回唯一的值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接