Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding which rows have all elements as zeros in a matrix with numpy

I have a large numpy matrix M. Some of the rows of the matrix have all of their elements as zero and I need to get the indices of those rows. The naive approach I'm considering is to loop through each row in the matrix and then check each elements. However I think there's a better and a faster approach to accomplish this using numpy. I hope you can help!

like image 200
Jack Twain Avatar asked May 18 '14 19:05

Jack Twain


People also ask

How do you check if all elements of a list are zero?

Use the all() function to check if all values in a list are zero, e.g. if all(item == 0 for item in my_list): . The all() function will return True if all values in the list are zero and False otherwise.

What is the use of zeros () function in NumPy?

The zeros() function is used to get a new array of given shape and type, filled with zeros. Shape of the new array, e.g., (2, 3) or 2. The desired data-type for the array, e.g., numpy. int8.

How do you find the non-zero element in NumPy?

nonzero() function is used to Compute the indices of the elements that are non-zero. It returns a tuple of arrays, one for each dimension of arr, containing the indices of the non-zero elements in that dimension. The corresponding non-zero values in the array can be obtained with arr[nonzero(arr)] .


1 Answers

Here's one way. I assume numpy has been imported using import numpy as np.

In [20]: a Out[20]:  array([[0, 1, 0],        [1, 0, 1],        [0, 0, 0],        [1, 1, 0],        [0, 0, 0]])  In [21]: np.where(~a.any(axis=1))[0] Out[21]: array([2, 4]) 

It's a slight variation of this answer: How to check that a matrix contains a zero column?

Here's what's going on:

The any method returns True if any value in the array is "truthy". Nonzero numbers are considered True, and 0 is considered False. By using the argument axis=1, the method is applied to each row. For the example a, we have:

In [32]: a.any(axis=1) Out[32]: array([ True,  True, False,  True, False], dtype=bool) 

So each value indicates whether the corresponding row contains a nonzero value. The ~ operator is the binary "not" or complement:

In [33]: ~a.any(axis=1) Out[33]: array([False, False,  True, False,  True], dtype=bool) 

(An alternative expression that gives the same result is (a == 0).all(axis=1).)

To get the row indices, we use the where function. It returns the indices where its argument is True:

In [34]: np.where(~a.any(axis=1)) Out[34]: (array([2, 4]),) 

Note that where returned a tuple containing a single array. where works for n-dimensional arrays, so it always returns a tuple. We want the single array in that tuple.

In [35]: np.where(~a.any(axis=1))[0] Out[35]: array([2, 4]) 
like image 122
Warren Weckesser Avatar answered Sep 20 '22 04:09

Warren Weckesser