首页 > 解决方案 > Numpy数组按升序仅获取项目和索引

问题描述

假设我有以下数组:

arr = [1,2,4,5,6,5,4,3,2,3,4,5,6,7,8]

我只想获取按升序排列的项目,而忽略中间的“反向”。

所以对于这个数组,我想得到: res = [1,2,4,5,6,7,8] ,在索引处:[0,1,2,4,13,14]

任何想法?

标签: pythonarraysnumpy

解决方案


我认为你应该使用累积的最大值来解决这个问题,即每个给定步骤的最大值:

>>> arr
array([1, 2, 4, 5, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 8])
>>> np.maximum.accumulate(arr)
array([1, 2, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8])

您可以执行以下操作:

>>> arr[arr == np.maximum.accumulate(arr)]
array([1, 2, 4, 5, 6, 6, 7, 8])

但是,这并不能处理保持不变的数字(你得到额外的 6),要处理这个问题,你可以“滚动”累积的最大数组并添加它不等于滚动数组的条件(即,数组的值不等于之前的最大值):

>>> m = np.maximum.accumulate(arr)
>>> arr[(arr == m) & (arr != np.roll(m, -1))]
array([1, 2, 4, 5, 6, 7, 8])

但实际上,您想要累积最大值的唯一值,因此您也可以将其用于np.unique

>>> np.unique(np.maximum.accumulate(arr))
array([1, 2, 4, 5, 6, 7, 8])

不知道哪个会更快,但想出好的测试数据并不是直截了当的。如果您有一个可调整大小的数组,我会对哪种方法对您的数据更快感兴趣。


推荐阅读