1

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

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

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.diffor np.cumsum

4

1 回答 1

4

您的代码似乎与您的描述不符。现在的代码将a = [3,2]保持不变,但会[3,2,1]变成[3, 2, 2],这看起来有点奇怪,并且设置accum = 0意味着负数的行为方式不会相同。

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

更常用的版本可以使用 来计算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.])

然后,如果您愿意,可以使用廉价的 hack 来恢复nan值:

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

(您也可以查看掩码数组,但我不经常使用它们,因为它们通常对我的需求来说太过分了。不过,其他人发现它们真的很有用。)

于 2013-05-15T14:20:41.117 回答