NumPy数组值的运行最大值

46
我需要一种快速的方法来保持numpy数组的运行最大值。例如,如果我的数组是:
x = numpy.array([11,12,13,20,19,18,17,18,23,21])

我希望:

numpy.array([11,12,13,20,20,20,20,20,23,23])

显然我可以用一个小循环来做到这一点:

def running_max(x):
    result = [x[0]]
    for val in x:
        if val > result[-1]:
            result.append(val)
        else:
            result.append(result[-1])
    return result

但我的数组有成千上万个条目,我需要调用多次。似乎有一种numpy技巧可以消除循环,但我似乎找不到任何可行的方法。另一种方法是将其编写为C扩展,但这似乎是重复造轮子。


我会称之为累计最大值 - 运行最大值对我来说暗示着一个窗口。不幸的是,用谷歌搜索并没有找到有用的东西。 - andrew cooke
1
我没有安装NumPy,但是max.accumulate可能有效。在文档中查看“accumulate”。 - andrew cooke
@andrew 在numpy中没有累积属性。如果有的话,那将是一个很好的内置解决方案。 - JoshAdel
7
@JoshAdel: numpy.maximum.accumulate - wim
2个回答

79

numpy.maximum.accumulate 对我有效。

>>> import numpy
>>> numpy.maximum.accumulate(numpy.array([11,12,13,20,19,18,17,18,23,21]))
array([11, 12, 13, 20, 20, 20, 20, 20, 23, 23])

Wim在我之前到那里了。 - Charles Beattie

3
如建议所述,可以使用 scipy.maximum.accumulate 函数:
In [9]: x
Out[9]: [1, 3, 2, 5, 4]

In [10]: scipy.maximum.accumulate(x)
Out[10]: array([1, 3, 3, 5, 5])

7
不需要从scipy命名空间获取它,它是一个numpy ufunc。在scipy.*中复制numpy符号是向后兼容的剩余物,来自Numeric时代。 - Robert Kern
抱歉,那是我的个人偏见。 - Steve Tjoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接