【问题标题】:Eliminating array rows based on a property of consecutive pairs of elements基于连续元素对的属性消除数组行
【发布时间】:2020-09-07 23:38:16
【问题描述】:

我们得到一个数组样本a,如下所示,以及一个常量c

import numpy as np

a = np.array([[1, 3, 1, 11, 9, 14],
              [2, 12, 1, 10, 7, 6],
              [6, 7, 2, 14, 2, 15],
              [14, 8, 1, 3, -7, 2],
              [0, -3, 0, 3, -3, 0],
              [2, 2, 3, 3, 12, 13],
              [3, 14, 4, 12, 1, 4],
              [0, 13, 13, 4, 0, 3]])
c = 2

在这个问题中,将每个数组行视为由三对组成很方便,因此第一行是[1,3, 1,11, 9,14]

定义:d_mintwo consecutive pairs的元素之间的最小差异 p>

问题:我想保留数组行a,其中所有连续对都有d_min <= c。否则,应该消除这些行。

在第一个数组行中,第一对 (1,3) 和第二对 (1,11) 具有 d_min = 1-1=0。 第二对(1,11)和第三对(9,14)有d_min = 11-9=2。 (在这两种情况下,d_min<=c,所以我们将这一行保留在a

在第二个数组行中,第一对 (2,12) 和第二对 (1,10) 具有 d_min = 2-1=1。 但是,第二对(1,10)和第三对(7,6)有d_min = 10-7=3。 (3 > c, 所以这行应该从数组a中删除)

目前的努力:我目前使用嵌套的 for 循环(2 深)来处理这个问题。
外部循环遍历数组a,确定前两对之间的d_min,使用:

for r in a
    d_min = np.amin(np.abs(np.subtract.outer(r[:2], r[2:4])))

内部循环使用相同的方法来确定最后两对之间的d_min。 只有当d_min<= c 用于两组连续对时,才会进行进一步处理。 我真的希望有一种方法可以避免 for 循环。我最终需要处理 8 列数组,而我目前的方法将涉及 3 深度循环。

在示例中,有 4 行消除。最终结果应如下所示:

a = np.array([[1, 3, 1, 11, 9, 14],
              [0, -3, 0, 3, -3, 0],
              [3, 14, 4, 12, 1, 4],
              [0, 13, 13, 4, 0, 3]])

【问题讨论】:

    标签: arrays numpy


    【解决方案1】:

    假设每行的元素个数总是偶数:

    import numpy as np
    
    a = np.array([[1, 3, 1, 11, 9, 14],
                  [2, 12, 1, 10, 7, 6],
                  [6, 7, 2, 14, 2, 15],
                  [14, 8, 1, 3, -7, 2],
                  [0, -3, 0, 3, -3, 0],
                  [2, 2, 3, 3, 12, 13],
                  [3, 14, 4, 12, 1, 4],
                  [0, 13, 13, 4, 0, 3]])
    c = 2
    
    # separate the array as previous pairs and next pairs
    sx, sy = a.shape
    prev_shape = sx, (sy - 2) // 2, 1, 2
    next_shape = sx, (sy - 2) // 2, 2, 1
    
    prev_pairs = a[:, :-2].reshape(prev_shape)
    next_pairs = a[:, 2:].reshape(next_shape)
    
    # subtract which will effectively work as outer subtraction due to numpy broadcasting, and 
    # calculate the minimum difference for each pair
    pair_diff_min = np.abs(prev_pairs - next_pairs).min(axis=(2, 3))
    
    # calculate the filter condition as boolean array
    to_keep = pair_diff_min.max(axis=1) <= c
    
    print(a[to_keep])
    #[[ 1  3  1 11  9 14]
    # [ 0 -3  0  3 -3  0]
    # [ 3 14  4 12  1  4]
    # [ 0 13 13  4  0  3]]
    

    Demo Link

    【讨论】:

    • 非常好的工作,很有启发性!作为一个相对较新的人,我花了一段时间才了解您如何在广播中使用 4d 数组来促进减法。真不错。
    猜你喜欢
    • 2021-03-28
    • 2021-11-24
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多