我们得到一个数组示例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__.元素之间的最小差异。
问题:我想保留数组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深)来处理这个问题。
外部循环运行在数组 of 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对两组连续对进行进一步处理时,才会进行进一步处理。我真的希望有一种方法来避免反循环。我最终需要处理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]])发布于 2020-09-08 00:04:53
假设每一行中的元素数总是相等的:
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]]https://stackoverflow.com/questions/63785411
复制相似问题