用numpy数组计算累积最小值

时间:2014-05-13 03:04:29

标签: python arrays numpy

我想计算累计最低值" array - 基本上是每个索引的最小值,例如:

import numpy as np
nums = np.array([5.,3.,4.,2.,1.,1.,2.,0.])
cumulative_min = np.zeros(nums.size, dtype=float)
for i,num in enumerate(nums):
    cumulative_min[i] = np.min(nums[0:i+1])

这有效(它返回正确的数组([5.,3.,3.,2.,1.,1.,1.,0。]) ),但如果可以的话,我想避免使用for循环。我认为构建一个二维数组并使用np.amin()函数可能会更快,但我也需要一个循环。

2 个答案:

答案 0 :(得分:21)

对于任何2参数NumPy universal function,其accumulate方法是该函数的累积版本。因此,numpy.minimum.accumulate正是您所寻找的:

>>> numpy.minimum.accumulate([5,4,6,10,3])
array([5, 4, 4, 4, 3])

答案 1 :(得分:1)

创建一个矩阵,下三角形(np.tril)填充数组nums的值和上三角形(np.triu,第二个参数为1,因此对角线保持空闲状态)填充了数组的最大值。 (编辑:而不是最大值,数组的第一个元素是更好的方式。 - >评论)

nums = np.array([5.,3.,4.,2.,1.,1.,2.,0.])
oneSquare = np.ones((nums.size, nums.size))

A = nums * np.tril(oneSquare)
B = np.triu(oneSquare, 1) * nums[0]
A, B

<强>输出:

(array([[ 5.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 5.,  3.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 5.,  3.,  4.,  0.,  0.,  0.,  0.,  0.],
       [ 5.,  3.,  4.,  2.,  0.,  0.,  0.,  0.],
       [ 5.,  3.,  4.,  2.,  1.,  0.,  0.,  0.],
       [ 5.,  3.,  4.,  2.,  1.,  1.,  0.,  0.],
       [ 5.,  3.,  4.,  2.,  1.,  1.,  2.,  0.],
       [ 5.,  3.,  4.,  2.,  1.,  1.,  2.,  0.]]),
 array([[ 0.,  5.,  5.,  5.,  5.,  5.,  5.,  5.],
       [ 0.,  0.,  5.,  5.,  5.,  5.,  5.,  5.],
       [ 0.,  0.,  0.,  5.,  5.,  5.,  5.,  5.],
       [ 0.,  0.,  0.,  0.,  5.,  5.,  5.,  5.],
       [ 0.,  0.,  0.,  0.,  0.,  5.,  5.,  5.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  5.,  5.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  5.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]]))

现在取每行的最小值:

(A+B).min(axis=1)

<强>输出:

array([ 5.,  3.,  3.,  2.,  1.,  1.,  1.,  0.])