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 operator which extracts values or slices
from a given tensor.
If indices contains duplicates, the associated updates are accumulated
(summed) into the output tensor.
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.
In Python, this scatter operation would look like this:
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.
In Python, this scatter operation would look like this:
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-04-26 UTC."],[],[],null,["# tf.scatter_nd\n\n\u003cbr /\u003e\n\nScatters `updates` into a tensor of shape `shape` according to `indices`.\n\n#### View aliases\n\n\n**Compat aliases for migration**\n\nSee\n[Migration guide](https://www.tensorflow.org/guide/migrate) for\nmore details.\n\n[`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)\n\n\u003cbr /\u003e\n\n tf.scatter_nd(\n indices: Annotated[Any, TV_ScatterNd_Tindices],\n updates: Annotated[Any, TV_ScatterNd_T],\n shape: Annotated[Any, TV_ScatterNd_Tindices],\n name=None\n ) -\u003e Annotated[Any, TV_ScatterNd_T]\n\n### Used in the notebooks\n\n| Used in the guide |\n|-------------------------------------------------------------------------------------|\n| - [Introduction to tensor slicing](https://www.tensorflow.org/guide/tensor_slicing) |\n\nScatter sparse `updates` according to individual values at the specified\n`indices`. This op returns an output tensor with the `shape` you specify. This\nop is the inverse of the [`tf.gather_nd`](../tf/gather_nd) operator which extracts values or slices\nfrom a given tensor.\n\nThis operation is similar to [`tf.tensor_scatter_nd_add`](../tf/tensor_scatter_nd_add), except that the tensor\nis zero-initialized. Calling [`tf.scatter_nd(indices, updates, shape)`](../tf/scatter_nd)\nis identical to calling\n`tf.tensor_scatter_nd_add(tf.zeros(shape, updates.dtype), indices, updates)`\n\nIf `indices` contains duplicates, the associated `updates` are accumulated\n(summed) into the output tensor.\n| **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`](../tf/config/experimental/enable_op_determinism).\n\n`indices` is an integer tensor containing indices into the output tensor. The\nlast dimension of `indices` can be at most the rank of `shape`: \n\n indices.shape[-1] \u003c= shape.rank\n\nThe last dimension of `indices` corresponds to indices of elements\n(if `indices.shape[-1] = shape.rank`) or slices\n(if `indices.shape[-1] \u003c shape.rank`) along dimension `indices.shape[-1]` of\n`shape`.\n\n`updates` is a tensor with shape: \n\n indices.shape[:-1] + shape[indices.shape[-1]:]\n\nThe simplest form of the scatter op is to insert individual elements in\na tensor by index. Consider an example where you want to insert 4 scattered\nelements in a rank-1 tensor with 8 elements. \n\nIn Python, this scatter operation would look like this: \n\n indices = tf.constant([[4], [3], [1], [7]])\n updates = tf.constant([9, 10, 11, 12])\n shape = tf.constant([8])\n scatter = tf.scatter_nd(indices, updates, shape)\n print(scatter)\n\nThe resulting tensor would look like this: \n\n [0, 11, 0, 10, 9, 0, 0, 12]\n\nYou can also insert entire slices of a higher rank tensor all at once. For\nexample, you can insert two slices in the first dimension of a rank-3 tensor\nwith two matrices of new values. \n\nIn Python, this scatter operation would look like this: \n\n indices = tf.constant([[1], [3]])\n updates = tf.constant([[[5, 5, 5, 5], [6, 6, 6, 6],\n [7, 7, 7, 7], [8, 8, 8, 8]],\n [[5, 5, 5, 5], [6, 6, 6, 6],\n [7, 7, 7, 7], [8, 8, 8, 8]]])\n shape = tf.constant([4, 4, 4])\n scatter = tf.scatter_nd(indices, updates, shape)\n print(scatter)\n\nThe resulting tensor would look like this: \n\n [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],\n [[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],\n [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],\n [[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]]]\n\nNote that on CPU, if an out of bound index is found, an error is returned.\nOn GPU, if an out of bound index is found, the index is ignored.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Args ---- ||\n|-----------|-----------------------------------------------------------------------------------------------|\n| `indices` | A `Tensor`. Must be one of the following types: `int16`, `int32`, `int64`. Tensor of indices. |\n| `updates` | A `Tensor`. Values to scatter into the output tensor. |\n| `shape` | A `Tensor`. Must have the same type as `indices`. 1-D. The shape of the output tensor. |\n| `name` | A name for the operation (optional). |\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Returns ------- ||\n|---|---|\n| A `Tensor`. Has the same type as `updates`. ||\n\n\u003cbr /\u003e"]]