# In TensorFlow, how can I get nonzero values and their indices from a tensor with python?

## Question:

I want to do something like this.

Let’s say we have a tensor A.

```
A = [[1,0],[0,4]]
```

And I want to get nonzero values and their indices from it.

```
Nonzero values: [1,4]
Nonzero indices: [[0,0],[1,1]]
```

There are similar operations in Numpy.

`np.flatnonzero(A)`

return indices that are non-zero in the flattened A.

`x.ravel()[np.flatnonzero(x)]`

extract elements according to non-zero indices.

Here’s a link for these operations.

How can I do somthing like above Numpy operations in Tensorflow with python?

(Whether a matrix is flattened or not doesn’t really matter.)

## Answers:

You can achieve same result in Tensorflow using not_equal and where methods.

```
zero = tf.constant(0, dtype=tf.float32)
where = tf.not_equal(A, zero)
```

`where`

is a tensor of the same shape as `A`

holding `True`

or `False`

, in the following case

```
[[True, False],
[False, True]]
```

This would be sufficient to select zero or non-zero elements from `A`

. If you want to obtain indices you can use `where`

method as follows:

```
indices = tf.where(where)
```

`where`

tensor has two `True`

values so `indices`

tensor will have two entries. `where`

tensor has rank of two, so entries will have two indices:

```
[[0, 0],
[1, 1]]
```

```
#assume that an array has 0, 3.069711, 3.167817.
mask = tf.greater(array, 0)
non_zero_array = tf.boolean_mask(array, mask)
```

What about using sparse tensors.

```
>>> A = [[1,0],[0,4]]
>>> sparse = tf.sparse.from_dense(A)
>>> sparse.values.numpy(), sparse.indices.numpy()
(array([1, 4], dtype=int32), array([[0, 0],
[1, 1]]))
```