Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between nonzero(a), where(a) and argwhere(a). When to use which?

Tags:

python

numpy

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 as np.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?

like image 207
Amelio Vazquez-Reina Avatar asked Apr 12 '13 16:04

Amelio Vazquez-Reina


People also ask

What is Argwhere?

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.

How does NP nonzero work?

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

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.

like image 144
mgilson Avatar answered Sep 18 '22 21:09

mgilson