Amelio Vazquez-Reina - 9 months ago 73

Python Question

, and , with being a numpy array, all seem to return the non-zero indices of the array. What are the differences between these three calls?

`where(a)`

`argwhere(a)`

`a`

- On the documentation says:
`argwhere`

is the same as`np.argwhere(a)`

.`np.transpose(np.nonzero(a))`

Why have a whole function that just transposes the output of? When would that be so useful that it deserves a separate function?`nonzero`

- What about the difference between and
`where(a)`

? Wouldn't they return the exact same result?`nonzero(a)`

Answer Source

`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.