Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Minimum value on a 2d array python

I have an array of the following structure which is simplified for this question:

8 2 3 4 5 6
3 6 6 7 2 6
3 8 5 1 2 9
6 4 2 7 8 3

I wish to find the minimum value in this 2D array however using the inbuilt min function returns a value error:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

I have looked into the alternative of using np.argmin:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmin.html

However it only evaluates along a single axis and returns the index of the minimum value along a single row/column whereas I wish to evaluate the whole array and return the lowest value not the indices.

If it is possible to return the index values of the lowest item in the array then that would be preferable also as from that the lowest value can easily be found.

EDIT: Thanks to the comments below np.min is the solution I was looking for and I was not aware of it existing so my answer is solved.

like image 872
cd123 Avatar asked Jun 08 '17 09:06

cd123


People also ask

How do you find the minimum of a 2D array?

min to return the minimum value, or equivalently for an array arrname use arrname. min() . As you mentioned, numpy. argmin returns the index of the minimum value (of course, you can then use this index to return the minimum value by indexing your array with it).

How do you find the minimum value in an array in python?

In python is very easy to find out maximum, minimum element and their position also. Python provides different inbuilt function. min() is used for find out minimum value in an array, max() is used for find out maximum value in an array. index() is used for finding the index of the element.

How do you find the maximum value of a 2D numpy array?

Find max values along the axis in 2D numpy array | max in rows or columns: If we pass axis=0 in numpy. amax() then it returns an array containing max value for each column i.e. If we pass axis = 1 in numpy.


3 Answers

You can use np.min()

>>> arr = np.array([[8,2,3,4,5,6],
                    [3,6,6,7,2,6],
                    [3,8,5,1,2,9],
                    [6,4,2,7,8,3]])

>>> arr.min()
1
like image 107
akash karothiya Avatar answered Sep 21 '22 06:09

akash karothiya


Alternatively for a non-numpy solution:

>>> a = [[8,2,3,4,5,6],
... [3,6,6,7,2,6],
... [3,8,5,1,2,9],
... [6,4,2,7,8,3]]
>>> mymin = min([min(r) for r in a])
>>> mymin
1
like image 28
Nick stands with Ukraine Avatar answered Sep 21 '22 06:09

Nick stands with Ukraine


However it only evaluates along a single axis and returns the index of the minimum value along a single row/column whereas I wish to evaluate the whole array and return the lowest value not the indices.

numpy.argmin does not by default evaluate along a single axis, the default is to evaluate along the flattened matrix and it returns the linear index in the flattened array; from the numpy docs that you linked:

By default, the index is into the flattened array, otherwise along the specified axis.

Either way, use numpy.amin or numpy.min to return the minimum value, or equivalently for an array arrname use arrname.min(). As you mentioned, numpy.argmin returns the index of the minimum value (of course, you can then use this index to return the minimum value by indexing your array with it). You could also flatten into a single dimension array with arrname.flatten() and pass that into the built-in min function.

The four following methods produce what you want.

import numpy as np

values = np.array([
    [8,2,3,4,5,6],
    [3,6,6,7,2,6],
    [3,8,5,1,2,9],
    [6,4,2,7,8,3]])

values.min()          # = 1
np.min(values)        # = 1
np.amin(values)       # = 1
min(values.flatten()) # = 1
like image 25
alkasm Avatar answered Sep 24 '22 06:09

alkasm