比较元素与前一个轴

时间:2013-05-15 13:52:31

标签: python numpy

我的问题如下。我有一个numpy数组(为了简单起见它可能是1D)的浮点数。我必须将一个元素与前一个元素进行比较,如果元素低于前一个元素,则替换它。这必须累积最大值。

我一直在用循环(我认为这也使问题更清楚)以下列方式进行。

import numpy as np

a = np.random.random(100) # The original array
accum = 0.0
for i in range(1,len(a)):
    if a[i] < accum:
        a[i] = accum
    else:
        accum = a[i]

我想知道是否可以通过某种类型的数组操作来完成此操作,类似于np.diffnp.cumsum

1 个答案:

答案 0 :(得分:4)

您的代码似乎与您的描述不符。现在的代码将保持a = [3,2]不变,但将[3,2,1]变为[3, 2, 2],这似乎有点奇怪,设置accum = 0表示负数不会表现相同

[我刚才注意到你之前的一个问题是关于Matlab,从1开始计算.Python是零索引的,所以第一个元素是a[0],所以这可能是无意的?] < / p>

可以使用np.maximum.accumulate计算更常用的版本,例如:

>>> a
array([6, 0, 7, 9, 9, 6, 9, 5, 1, 8])
>>> your_code(a)
array([6, 0, 7, 9, 9, 9, 9, 9, 9, 9])
>>> np.maximum.accumulate(a)
array([6, 6, 7, 9, 9, 9, 9, 9, 9, 9])

如果您确实需要原始行为,那么也许您可以将第一个值修补为零,调用np.maximum.accumulate,然后重新插入a[0]。无论如何,这样的事情应该有效。


[更新]

这会传播nan

>>> a
array([  2.,   1.,  nan,   3.,   4.,   1.])
>>> np.maximum.accumulate(a)
array([  2.,   2.,  nan,  nan,  nan,  nan])

如果您希望填写这些内容,可以改为使用fmax

>>> np.fmax.accumulate(a)
array([ 2.,  2.,  2.,  3.,  4.,  4.])

或使用np.nan_to_num()nan值设置为零:

>>> np.maximum.accumulate(np.nan_to_num(a))
array([ 2.,  2.,  2.,  3.,  4.,  4.])

如果您愿意,可以使用便宜的黑客来恢复nan值:

>>> np.fmax.accumulate(a) + (a*0)
array([  2.,   2.,  nan,   3.,   4.,   4.])

(您也可以查看蒙面数组,但我不经常使用它们,因为它们通常会因我的需要而过度使用。但是其他人发现它们确实非常有用。)