2013-05-15 42 views
1

我的问题是以下。为了简单起见,我有一个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来完成。

+0

我很感谢你的具体,但我有点担心你的例子不足以说明问题。你能举几个例子来展示你想要的输入和输出吗? –

+0

请检查帝斯曼的答案。这是我真正想要的。对不起,我的不好解释,并感谢您的兴趣。 –

回答

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.]) 

,然后你可以使用廉价的破解,如果你想恢复nan值:

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

(你也可以看看蒙面阵列,但我不很经常使用它们他们通常是为我的需要矫枉过正。不过,其他人觉得他们真的很有用。)

+0

非常感谢!这个工作就像我想要的一样!也许我解释说自己有点不好......所有的值都在0和1之间,这就是为什么我把累加器设置为1。我在2D阵列(真实数据集)中也尝试过它,并且我可以非常容易地沿着所需的轴执行此操作。 作为一个额外的...¿这可以通过包含nans的数组来完成吗? –

+0

@IñigoHernáezCorres:你没有说你想让系统在涉及nans的时候表现得如何,所以我采取了一些猜测。 – DSM

+0

这是完美的,使用'fmax'填充nans,这正是我所期望的。 –