为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕神8447489 2022-06-22 17:55:33
考虑两个排序numpy数组: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])我如何: 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。这篇文章与我的问题最接近,但它从两个列表中删除了所有重复实例。
查看完整描述

4 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

您可以使用collections.Counter:


from collections import Counter


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])


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])


查看完整回答
反对 回复 2022-06-22
?
墨色风雨

TA贡献1853条经验 获得超6个赞

根据这个问题,我不是 100% 确定您要做什么,但我已经能够使用所描述的方法复制输出。


import numpy as np


# List of b that are not in a

a = 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 LIST

import collections

counter=collections.Counter(a)

print(counter)

newa = list(a)

for k,v in counter.items():

    if v > 1:

        newa.remove(k)

print(newa)


查看完整回答
反对 回复 2022-06-22
?
富国沪深

TA贡献1790条经验 获得超9个赞

您可以使用以下方法找到相交项的首次出现索引,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])


查看完整回答
反对 回复 2022-06-22
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

如果您不介意冗长:


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])


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)


查看完整回答
反对 回复 2022-06-22
  • 4 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信