首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于连续对元素的属性消除数组行

基于连续对元素的属性消除数组行
EN

Stack Overflow用户
提问于 2020-09-07 23:38:16
回答 1查看 36关注 0票数 0

我们得到一个数组示例a (如下所示)和一个常量c

代码语言:javascript
复制
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

代码语言:javascript
复制
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行冲销。最终结果应该如下所示:

代码语言:javascript
复制
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]])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-08 00:04:53

假设每一行中的元素数总是相等的:

代码语言:javascript
复制
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]]

演示链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63785411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档