【发布时间】: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_min是two 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]])
【问题讨论】: