Dave
Dave

Reputation: 348

Find min value and index of the value in a matrix column after column

I have a problem, which seems to be easy but it is causing me a lot of headache. The problem is that I'm programming in python (I'm relative new to it) and I'm looking for an aquivalent of the function max (min) of a matrix in matlab but using numpy.

What I want to do is to get the minimum value and its index in a matrix

Just to keep it as easiest as possible with an example, let's say this is the matrix:

arr2D = np.array([[11, 12, 13, 34],
                  [14, 15, 16, 3],
                  [17, 15, 11, 1],
                  [7,   5, 11, 4],
                  [1,  12,  4, 4],
                  [12, 14, 15,-3]])

in matlab I would do:

[local_max, index] = min(arr2D)

and I would get the min value and its index for every column in the matrix.

Trying to repeat the same in python (after looking here and here) with the following code:

print(np.where(arr2D == np.amin(arr2D, axis = 0)))   # axis 0 is for columns

I get the following output:

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

which is not really what I want to get!

The expected output should be:

[1, 4]   # Meaning the minimum value is 1 and it is in row 4 for the first column
[5, 3]   # Meaning the minimum value is 5 and it is in row 3 for the second column
[4, 4]   # Meaning the minimum value is 4 and it is in row 4 for the third column
[-3, 5]  # Meaning the minimum value is -3 and it is in row 5 for the last column

I cannot use the output I get by:

print(np.where(arr2D == np.amin(arr2D, axis = 0)))

Or I don't understand the output or that's not the right way to get the aquivalent function max (min) of matlab.

Could you help me?

UPDATE: I forgot to say that the matrix is float and not integer. I used integer just for the example

Upvotes: 3

Views: 1195

Answers (2)

Khashayar
Khashayar

Reputation: 438

Use this code (you can simply make a function out of it):

import numpy as np

arr2D = np.array([[11, 12, 13, 34],
            [14, 15, 16, 3],
            [17, 15, 11, 1],
            [7,   5, 11, 4],
            [1,  12,  4, 4],
            [12, 14, 15,-3]])

flat = arr2D.flatten()
arrayIndex = flat.tolist().index(min(flat))

// results
rowIndex = int(minIndex/arr2D.shape[0])
columnIndex = minIndex % arr2D.shape[1]

Upvotes: 2

Michael Szczesny
Michael Szczesny

Reputation: 5036

np.amin or np.min returns the min values along an axis

np.amin(arr2D, axis=0)

Out:

array([ 1,  5,  4, -3])

np.argmin returns the indices

np.argmin(arr2D, axis=0)

Out:

array([4, 3, 4, 5])

To get the desired output you can use np.vstack and transpose the array

np.vstack([np.amin(arr2D, axis=0), np.argmin(arr2D, axis=0)]).T

Out:

array([[ 1,  4],
       [ 5,  3],
       [ 4,  4],
       [-3,  5]])

Upvotes: 3

Related Questions