【问题标题】:Numpy filtering based on all row values基于所有行值的 Numpy 过滤
【发布时间】:2019-03-05 09:41:03
【问题描述】:

我正在尝试使用另一个 2D numpy 数组值过滤 2D numpy 数组。像这样的:

array1 = np.array([[ 0,  0],
                   [86,  4],
                   [75, 74],
                   [78, 55],
                   [53, 94],
                   [49, 83],
                   [99, 75],
                   [99, 10],
                   [32,  4],
                   [55, 99],
                   [62, 95],
                   [ 0,  0]])
array2 = np.array([[55, 99],
                   [32,  4],
                   [75, 74]])
array1[np.isin(array1, array2[2:5]).all(axis=1) == 0]

我的理想输出将是 array1 的过滤版本,其中没有与 array2 切片中的行相等的行。 问题是当我这样做时:

np.isin(array1, array[2:5])

输出是:

array([[False, False],
   [False,  True],
   [ True,  True],
   [False,  True],
   [False, False],
   [False, False],
   [ True,  True],
   [ True, False],
   [ True,  True],
   [ True,  True],
   [False, False],
   [False, False]])

它错误地将 [99,75] 行分类为 [True, True],因为这两个值都单独存在于我们的数组 2 中。 是否有更正确的方法来根据行的所有值进行过滤?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    这是使用 np.all() 执行此操作的一种低效但非常明确的方法:

    # for each row in array2, check full match with each row in array1
    bools = [np.all(array1==row,axis=1) for row in array2]
    
    # combine 3 boolean arrays with 'or' logic
    mask = [any(tup) for tup in zip(*bools)]
    
    # flip the mask
    mask = ~np.array(mask)
    
    # final index
    out = array1[mask]
    

    【讨论】:

    • 我试图实现有序交叉算法。如果您的所有行都是唯一的,则此方法有效。如果有人尝试这样做,请确保您的所有行也是唯一的。
    • 对不起,我想我不太明白 - 如果array1array2 中有重复项,上面的代码应该可以工作。如果行不是唯一的,你能分享更多关于这个问题的信息吗?
    • 您的解决方案完美运行。有序交叉是遗传算法中使用的一种方法。例如,这些可以是您的父母 A = [a,b,c,a,c,b], B=[a,c,b,c,a,b]。要创建一个孩子,您可以使用有序交叉。你随机切片。(即2-4)。从 A 你取 2-4 片。孩子 = [,,c,a,,]。您从 B 中删除第一次出现的 c 和 a,然后按照它们出现的顺序将剩余的基因放入 child。我使用遗传算法创建了一个旅行商求解器。我的基因中没有任何重复。如果有人想尝试相同的方法,他们应该知道它会删除重复项。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2018-06-21
    • 2018-08-21
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多