您的代码似乎与您的描述不符。现在的代码将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.])
(您也可以查看掩码数组,但我不经常使用它们,因为它们通常对我的需求来说太过分了。不过,其他人发现它们真的很有用。)