找到两个数组的非重叠值

15 投票
5 回答
19555 浏览
提问于 2025-04-18 16:40

如果我有两个numpy数组,想要找出它们之间不重合的值,我该怎么做呢?

这里有一个我搞不清楚的简单例子。

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

我想找出不重合的值。在这个例子中,我希望我的输出是:

['Brian','Craig']

与我想要的相反的结果可以用这个方法得到:

c=np.intersect1d(a,b)

这个方法返回的是:

['Andrew' 'Steve']

5 个回答

-2
import numpy as np

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

你可以使用

set(a) - set(b)

输出:

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

注意:集合操作会返回唯一的值

0

这段代码可以用来处理Python中的数组。

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

它首先会找出数组a中那些不在数组b里的元素,然后再把数组b中那些不在数组a里的元素加进来。这样一来,你就得到了所有在a或b中的元素,但不包括同时在两个数组中的元素。

4
np.setdiff1d(a,b)
a = [1,2,3]
b = [1,3]
np.setdiff1d(a,b)  -> returns [2]
np.setdiff1d(b,a)  -> returns []

这个代码会返回第一个参数和第二个参数之间没有交集的值。
举个例子:

22

你可以使用 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))

撰写回答