Lorenzo Vannucchi
Lorenzo Vannucchi

Reputation: 369

Python: return the row index of the minimum in a matrix

I wanna print the index of the row containing the minimum element of the matrix

my matrix is matrix = [[22,33,44,55],[22,3,4,12],[34,6,4,5,8,2]]

and the code

matrix = [[22,33,44,55],[22,3,4,12],[34,6,4,5,8,2]]
a = np.array(matrix)
buff_min = matrix.argmin(axis = 0)

print(buff_min)   #index of the row containing the minimum element

min = np.array(matrix[buff_min])

print(str(min.min(axis=0)))  #print the minium of that row

print(min.argmin(axis = 0)) #index of the minimum

print(matrix[buff_min]) # print all row containing the minimum

after running, my result is

1
3
1
[22, 3, 4, 12]

the first number should be 2, because the minimum is 2 in the third list ([34,6,4,5,8,2]), but it returns 1. It returns 3 as minimum of the matrix. What's the error?

Upvotes: 0

Views: 2390

Answers (2)

Nishant Patel
Nishant Patel

Reputation: 1406

I am not sure which version of Python you are using, i tested it for Python 2.7 and 3.2 as mentioned your syntax for argmin is not correct, its should be in the format

import numpy as np
np.argmin(array_name,axis)

Next, Numpy knows about arrays of arbitrary objects, it's optimized for homogeneous arrays of numbers with fixed dimensions. If you really need arrays of arrays, better use a nested list. But depending on the intended use of your data, different data structures might be even better, e.g. a masked array if you have some invalid data points.

If you really want flexible Numpy arrays, use something like this:

np.array([[22,33,44,55],[22,3,4,12],[34,6,4,5,8,2]], dtype=object)

However this will create a one-dimensional array that stores references to lists, which means that you will lose most of the benefits of Numpy (vector processing, locality, slicing, etc.).

Also, to mention if you can resize your numpy array thing might work, i haven't tested it, but by the concept that should be an easy solution. But i will prefer use a nested list in this case of input matrix

Upvotes: 1

Valéry
Valéry

Reputation: 4704

Does this work?

np.where(a == a.min())[0][0]

Note that all rows of the matrix need to contain the same number of elements.

Upvotes: 0

Related Questions