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!
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.
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.
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)] .
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])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With