我想计算累计最低值" 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()函数可能会更快,但我也需要一个循环。
答案 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.])