Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find the index of a value in 2d array in Python?

I need to figure out how I can find all the index of a value in a 2d numpy array.

For example, I have the following 2d array:

([[1 1 0 0],   [0 0 1 1],   [0 0 0 0]]) 

I need to find the index of all the 1's and 0's.

1: [(0, 0), (0, 1), (1, 2), (1, 3)] 0: [(0, 2), (0, 3), (1, 0), (1, 1), (the entire all row)] 

I tried this but it doesn't give me all the indexes:

t = [(index, row.index(1)) for index, row in enumerate(x) if 1 in row] 

Basically, it gives me only one of the index in each row [(0, 0), (1, 2)].

like image 844
Pete Avatar asked Nov 27 '14 16:11

Pete


People also ask

How do I find the index of a 2D array?

Accessing 2D Array Elements In Java, when accessing the element from a 2D array using arr[first][second] , the first index can be thought of as the desired row, and the second index is used for the desired column. Just like 1D arrays, 2D arrays are indexed starting at 0 .

How do you find the index of an element in a 2D NumPy array?

Index of element in 2D array We can also use the np. where() function to find the position/index of occurrences of elements in a two-dimensional or multidimensional array. For a 2D array, the returned tuple will contain two numpy arrays one for the rows and the other for the columns.


2 Answers

You can use np.where to return a tuple of arrays of x and y indices where a given condition holds in an array.

If a is the name of your array:

>>> np.where(a == 1) (array([0, 0, 1, 1]), array([0, 1, 2, 3])) 

If you want a list of (x, y) pairs, you could zip the two arrays:

>>> zip(*np.where(a == 1)) [(0, 0), (0, 1), (1, 2), (1, 3)] 

Or, even better, @jme points out that np.asarray(x).T can be a more efficient way to generate the pairs.

like image 120
Alex Riley Avatar answered Sep 19 '22 12:09

Alex Riley


The problem with the list comprehension you provided is that it only goes one level deep, you need a nested list comprehension:

a = [[1,0,1],[0,0,1], [1,1,0]]  >>> [(ix,iy) for ix, row in enumerate(a) for iy, i in enumerate(row) if i == 0] [(0, 1), (1, 0), (1, 1), (2, 2)] 

That being said, if you are working with a numpy array, it's better to use the built in functions as suggested by ajcr.

like image 45
Mike Avatar answered Sep 19 '22 12:09

Mike