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]

任何想法?

我认为您应该使用累积最大值来处理此问题,即每个给定步骤的最大值:

>>> 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])

不确定哪一个更快,但是想出好的测试数据并不是直截了当的。如果你有一个可伸缩的数组,我想知道哪种方法对你的数据更快。

最新更新