使用numpy setdiff1d保持顺序

时间:2017-09-17 07:23:32

标签: python numpy

a = np.array([1, 2, 3])
b = np.array([4, 2, 3, 1, 0])
c = np.setdiff1d(b, a)
print("c", c)

结果是c [0, 4],但我想要的答案是c [4 0]

我该怎么做?

2 个答案:

答案 0 :(得分:2)

使用np.in1d获取不匹配的掩码,并将{boolean-index简单地添加到b中以保留其中元素的顺序 -

b[~np.in1d(b,a)]

逐步运行示例 -

In [14]: a
Out[14]: array([1, 2, 3])

In [15]: b
Out[15]: array([4, 2, 3, 1, 0])

In [16]: ~np.in1d(b,a)
Out[16]: array([ True, False, False, False,  True], dtype=bool)

In [17]: b[~np.in1d(b,a)]
Out[17]: array([4, 0])

答案 1 :(得分:2)

如果您希望c 1)b的元素不在a和2},则它们的顺序与{{1}中的顺序相同你可以使用列表理解:

b

setdiff1d将数组视为集合,因此:1)不尊重元素的顺序,2)任何多次出现的元素被视为只存在一次。例如这段代码:

c = np.array([el for el in b if el not in a])

将产生

a = np.array([4])
b = np.array([2, 4, 2, 1, 1])
c = np.setdiff1d(b, a)
print(c)