从两个 numpy 数组中删除匹配的元素

考虑两个排序numpy数组:


import numpy as np


a = np.array([1,2,4,4,6,8,10,10,21])

b = np.array([3,3,4,6,10,18,22])

我如何: 1. 查找出现在两个列表中的元素,以及 2. 从每个列表中仅删除该出现的一个实例。


那就是输出应该是:


a = [1,2,4,8,10,21]


b = [3,3,18,22]

所以即使有重复,也只会删除一个实例。但是,如果列表是


c = np.array([1,2,4,4,6,8,10,10,10,21])

d = np.array([3,3,4,6,10,10,18,22])

我希望获得新的输出:


c = [1,2,4,8,10,21]


d = [3,3,18,22]

这与上面相同。不同之处在于列表中 10 的数量。列表中的两个 10 中的d每一个都会从c相同的结果中删除一个 10。


这篇文章与我的问题最接近,但它从两个列表中删除了所有重复实例。


慕神8447489
浏览 229回答 4
4回答

红糖糍粑

您可以使用collections.Counter:from collections import Counterimport numpy as npa = np.array([1, 2, 4, 4, 6, 8, 10, 10, 21])b = np.array([3, 3, 4, 6, 10, 18, 22])ca = Counter(a)cb = Counter(b)result_a = sorted((ca - cb).elements())result_b = sorted((cb - ca).elements())print(result_a)print(result_b)输出[1, 2, 4, 8, 10, 21][3, 3, 18, 22]它返回相同的结果(如预期的那样):a = np.array([1, 2, 4, 4, 6, 8, 10, 10, 10, 21])b = np.array([3, 3, 4, 6, 10, 10, 18, 22])

墨色风雨

根据这个问题,我不是 100% 确定您要做什么,但我已经能够使用所描述的方法复制输出。import numpy as np# List of b that are not in aa = np.array([1,2,4,4,6,8,10,10,21])b = np.array([3,3,4,6,10,18,22])newb = [x for x in b if x not in a]print(newb)# REMOVE ONE DUPLICATED ELEMENT FROM LISTimport collectionscounter=collections.Counter(a)print(counter)newa = list(a)for k,v in counter.items():    if v > 1:        newa.remove(k)print(newa)

富国沪深

您可以使用以下方法找到相交项的首次出现索引,np.searchsorted然后使用np.delete()函数将其删除:In [58]: intersect = a[np.in1d(a, b)]In [59]: mask1 = np.searchsorted(a, intersect)In [60]: mask2 = np.searchsorted(b, intersect)In [61]: np.delete(a, mask1)Out[61]: array([ 1,  2,  4,  8, 10, 21])In [62]: np.delete(b, mask2)Out[62]: array([ 3,  3, 18, 22])

白猪掌柜的

如果您不介意冗长:import numpy as npa = np.array([1,2,4,4,6,8,10,10,21])b = np.array([3,3,4,6,10,18,22])common_values = set(a) & set(b)a = a.tolist()b = b.tolist()for value in common_values:    a.remove(value)    b.remove(value)a = np.array(a)b = np.array(b)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python