I know that in numpy I can compute the element-wise minimum of two vectors with
numpy.minimum(v1, v2)
What if I have a list of vectors of equal dimension, V = [v1, v2, v3, v4]
(but a list, not an array)? Taking numpy.minimum(*V)
doesn't work. What's the preferred thing to do instead?
*V
works if V
has only 2 arrays. np.minimum
is a ufunc
and takes 2 arguments.
As a ufunc
it has a .reduce
method, so it can apply repeated to a list inputs.
In [321]: np.minimum.reduce([np.arange(3), np.arange(2,-1,-1), np.ones((3,))]) Out[321]: array([ 0., 1., 0.])
I suspect the np.min
approach is faster, but that could depend on the array and list size.
In [323]: np.array([np.arange(3), np.arange(2,-1,-1), np.ones((3,))]).min(axis=0) Out[323]: array([ 0., 1., 0.])
The ufunc
also has an accumulate
which can show us the results of each stage of the reduction. Here's it's not to interesting, but I could tweak the inputs to change that.
In [325]: np.minimum.accumulate([np.arange(3), np.arange(2,-1,-1), np.ones((3,))]) ...: Out[325]: array([[ 0., 1., 2.], [ 0., 1., 0.], [ 0., 1., 0.]])
Convert to NumPy array and perform ndarray.min
along the first axis -
np.asarray(V).min(0)
Or simply use np.amin
as under the hoods, it will convert the input to an array before finding the minimum along that axis -
np.amin(V,axis=0)
Sample run -
In [52]: v1 = [2,5] In [53]: v2 = [4,5] In [54]: v3 = [4,4] In [55]: v4 = [1,4] In [56]: V = [v1, v2, v3, v4] In [57]: np.asarray(V).min(0) Out[57]: array([1, 4]) In [58]: np.amin(V,axis=0) Out[58]: array([1, 4])
If you need to final output as a list, append the output with .tolist()
.