我的问题如下。我有一个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.diff
或np.cumsum
。
答案 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.])
(您也可以查看蒙面数组,但我不经常使用它们,因为它们通常会因我的需要而过度使用。但是其他人发现它们确实非常有用。)