在没有 Python 循环的情况下使 numpy 数组单调

Make a numpy array monotonic without a Python loop

我有一个值的一维数组,它应该是单调的(比方说递减),但是在随机区域中值随索引增加。

我需要一个数组,其中每个区域都被直接替换为它前面的值,以便对生成的数组进行排序。

所以如果给定的数组是:

a = np.array([10.0, 9.5, 8.0, 7.2, 7.8, 8.0, 7.0, 5.0, 3.0, 2.5, 3.0, 2.0])

我想要的结果是

b = np.array([10.0, 9.5, 8.0, 7.2, 7.2, 7.2, 7.0, 5.0, 3.0, 2.5, 2.5, 2.0])

这是一个图形表示:

我知道如何用 Python 循环实现它,但是有没有办法用 NumPy 机器来实现它?

Python 为清楚起见,代码:

b = np.array(a)
for i in range(1, b.size):
    if b[i] > b[i-1]:
        b[i] = b[i-1]

您可以使用 np.minimum.accumulate 在数组中移动时收集最小值:

>>> np.minimum.accumulate(a)
array([ 10. ,   9.5,   8. ,   7.2,   7.2,   7.2,   7. ,   5. ,   3. ,
         2.5,   2.5,   2. ])

在数组中的每个元素处,此函数 returns 到目前为止看到的最小值。

如果你想让数组单调递增,你可以使用np.maximum.accumulate.

NumPy 中的许多其他通用函数都有一个 accumulate 方法来模拟遍历数组,将函数应用于每个元素并将返回值收集到相同大小的数组中。