Cumulative minimum calculation using numpy arrays

I would like to calculate the “cumulative minimum” array - basically the minimum array value before each index, for example:

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

This works (it returns the correct array ([5., 3., 3., 2., 1., 1., 1., 0.])), but I would like to avoid the for loop if I can. I thought it was faster to build a 2-dimensional array and use the np.amin () function, but I also need a loop.

+8
python arrays numpy
source share
2 answers

For any 2-argument NumPy universal function, its accumulate method is a cumulative version of this function. So numpy.minimum.accumulate is what you are looking for:

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

Create a matrix, the lower triangle ( np.tril ) is filled with the values ​​of your nums array and your upper triangle ( np.triu , with the second parameter 1, so the diagonal remains free) is filled with the maximum array. ( EDIT : instead of the maximum, the first element of the array is the best way. → comments)

 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 

Of:

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

Now take the minimum of each line:

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

Of:

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

All Articles