在没有Python循环的情况下制作一个numpy数组单调

时间:2015-02-17 14:30:05

标签: python arrays numpy vectorization

我有一个值的一维数组,它应该是单调的(比如减少),但随机区域的值会随着索引而增加。

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

所以如果给定的数组是:

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

这是一个图形表示:

example

我知道如何使用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]

1 个答案:

答案 0 :(得分:18)

您可以使用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. ])

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

如果您希望数组增加单调,则可以使用np.maximum.accumulate

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