<br />

Scatters `updates` into a tensor of shape `shape` according to `indices`.

#### View aliases


**Compat aliases for migration**

See
[Migration guide](https://www.tensorflow.org/guide/migrate) for
more details.

[`tf.compat.v1.manip.scatter_nd`](https://www.tensorflow.org/api_docs/python/tf/scatter_nd), [`tf.compat.v1.scatter_nd`](https://www.tensorflow.org/api_docs/python/tf/scatter_nd)

<br />

    tf.scatter_nd(
        indices: Annotated[Any, TV_ScatterNd_Tindices],
        updates: Annotated[Any, TV_ScatterNd_T],
        shape: Annotated[Any, TV_ScatterNd_Tindices],
        bad_indices_policy: str = '',
        name=None
    ) -> Annotated[Any, TV_ScatterNd_T]

### Used in the notebooks

| Used in the guide |
|---|
| - [Introduction to tensor slicing](https://www.tensorflow.org/guide/tensor_slicing) |

Scatter sparse `updates` according to individual values at the specified
`indices`. This op returns an output tensor with the `shape` you specify. This
op is the inverse of the [`tf.gather_nd`](https://www.tensorflow.org/api_docs/python/tf/gather_nd) operator which extracts values or slices
from a given tensor.

This operation is similar to [`tf.tensor_scatter_nd_add`](https://www.tensorflow.org/api_docs/python/tf/tensor_scatter_nd_add), except that the tensor
is zero-initialized. Calling [`tf.scatter_nd(indices, updates, shape)`](https://www.tensorflow.org/api_docs/python/tf/scatter_nd)
is identical to calling
`tf.tensor_scatter_nd_add(tf.zeros(shape, updates.dtype), indices, updates)`

If `indices` contains duplicates, the associated `updates` are accumulated
(summed) into the output tensor.

> [!WARNING]
> **Warning:** For floating-point data types, the output may be nondeterministic. This is because the order in which the updates are applied is nondeterministic and when floating-point numbers are added in different orders the resulting numerical approximation error can be slightly different. However, the output will be deterministic if op determinism is enabled via [`tf.config.experimental.enable_op_determinism`](https://www.tensorflow.org/api_docs/python/tf/config/experimental/enable_op_determinism).

`indices` is an integer tensor containing indices into the output tensor. The
last dimension of `indices` can be at most the rank of `shape`:

    indices.shape[-1] <= shape.rank

The last dimension of `indices` corresponds to indices of elements
(if `indices.shape[-1] = shape.rank`) or slices
(if `indices.shape[-1] < shape.rank`) along dimension `indices.shape[-1]` of
`shape`.

`updates` is a tensor with shape:

    indices.shape[:-1] + shape[indices.shape[-1]:]

The simplest form of the scatter op is to insert individual elements in
a tensor by index. Consider an example where you want to insert 4 scattered
elements in a rank-1 tensor with 8 elements.
![](https://www.tensorflow.org/images/ScatterNd1.png)

In Python, this scatter operation would look like this:

        indices = tf.constant([[4], [3], [1], [7]])
        updates = tf.constant([9, 10, 11, 12])
        shape = tf.constant([8])
        scatter = tf.scatter_nd(indices, updates, shape)
        print(scatter)

The resulting tensor would look like this:

    [0, 11, 0, 10, 9, 0, 0, 12]

You can also insert entire slices of a higher rank tensor all at once. For
example, you can insert two slices in the first dimension of a rank-3 tensor
with two matrices of new values.
![](https://www.tensorflow.org/images/ScatterNd2.png)

In Python, this scatter operation would look like this:

        indices = tf.constant([[1], [3]])
        updates = tf.constant([[[5, 5, 5, 5], [6, 6, 6, 6],
                                [7, 7, 7, 7], [8, 8, 8, 8]],
                               [[5, 5, 5, 5], [6, 6, 6, 6],
                                [7, 7, 7, 7], [8, 8, 8, 8]]])
        shape = tf.constant([4, 4, 4])
        scatter = tf.scatter_nd(indices, updates, shape)
        print(scatter)

The resulting tensor would look like this:

    [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
     [[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
     [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
     [[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]]]

If `indices` contains any out-of-bound indices, depending on
`bad_indices_policy`, the op will either return an error or ignore the
out-of-bound indices. `bad_indices_policy` can be one of the following values:

1. "" or "DEFAULT": raises on CPU and ignore on GPU. This is because historically on CPU and GPU we handle errors in different ways, and for backward compatibility we keep the default behavior.
2. "ERROR": raises error; GPU does not support this value.
3. "IGNORE": ignore the bad indices; supported on both CPU and GPU.

<br />

<br />

<br />

| ## Args ||
|---|---|
| `indices` | A `Tensor`. Must be one of the following types: `int16`, `int32`, `int64`. Tensor of indices. |
| `updates` | A `Tensor`. Values to scatter into the output tensor. |
| `shape` | A `Tensor`. Must have the same type as `indices`. 1-D. The shape of the output tensor. |
| `bad_indices_policy` | An optional `string`. Defaults to `""`. |
| `name` | A name for the operation (optional). |

<br />

<br />

<br />

<br />

| ## Returns ||
|---|---|
| A `Tensor`. Has the same type as `updates`. ||

<br />