In Numpy, nonzero(a)
, where(a)
and argwhere(a)
, with a
being a numpy array, all seem to return the non-zero indices of the array. What are the differences between these three calls?
On argwhere
the documentation says:
np.argwhere(a)
is the same asnp.transpose(np.nonzero(a))
.
Why have a whole function that just transposes the output of nonzero
? When would that be so useful that it deserves a separate function?
What about the difference between where(a)
and nonzero(a)
? Wouldn't they return the exact same result?
argwhere() is a Numpy library function used to find the indices of array elements that are nonzero, grouped by element. The numpy argwhere() function takes an array-like parameter and returns the indices of the array elements.
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)] .
nonzero
and argwhere
both give you information about where in the array the elements are True
. where
works the same as nonzero
in the form you have posted, but it has a second form:
np.where(mask,a,b)
which can be roughly thought of as a numpy "ufunc" version of the conditional expression:
a[i] if mask[i] else b[i]
(with appropriate broadcasting of a
and b
).
As far as having both nonzero
and argwhere
, they're conceptually different. nonzero
is structured to return an object which can be used for indexing. This can be lighter-weight than creating an entire boolean mask if the 0's are sparse:
mask = a == 0 # entire array of bools mask = np.nonzero(a)
Now you can use that mask to index other arrays, etc. However, as it is, it's not very nice conceptually to figure out which indices correspond to 0 elements. That's where argwhere
comes in.
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