【发布时间】:2020-06-20 03:17:36
【问题描述】:
假设我有一个 NumPy 数组:
x = np.array([2, 3, 4, 0, 0, 1, 1, 4, 6, 5, 8, 9, 9, 4, 2, 0, 3])
对于x >= 2 中的所有值,我需要找到x >=2 的连续值的开始/停止索引(即不计算一个大于或等于2 的单个值的运行)。然后,我对x >= 3、x >=4、...、x >= x.max() 重复此操作。 输出应该是一个 NumPy 数组 三列(第一列是最小值,第二列是包含开始索引,第三列是停止索引),看起来像:
[[2, 0, 2],
[2, 7, 14],
[3, 1, 2],
[3, 7, 13],
[4, 7, 13],
[5, 8, 12],
[6, 10, 12],
[8, 10, 12],
[9, 11, 12]
]
天真地,我可以查看每个唯一值,然后搜索开始/停止索引。但是,这需要对x 进行多次传递。完成此任务的最佳 NumPy 矢量化方式是什么?是否有不需要多次传递数据的解决方案?
更新
我意识到我还需要计算单个实例。所以,我的输出应该是:
[[2, 0, 2],
[2, 7, 14],
[2, 16, 16], # New line needed
[3, 1, 2],
[3, 7, 13],
[3, 16, 16], # New line needed
[4, 2, 2], # New line needed
[4, 7, 13],
[5, 8, 12],
[6, 8, 8], # New line needed
[6, 10, 12],
[8, 10, 12],
[9, 11, 12]
]
【问题讨论】:
-
np.where(x>2)可能是一个开始。 -
...和
tests = np.arange(2,x.max()+1); q = np.greater(x,tests[:,None]); np.argwhere(q) -
不应该
[7, 10, 12]也在结果数组中,它来自 x >=7? -
@AndreasK。我看到您已经为这两种情况提供了解决方案。确实,我可能两者都需要。谢谢!