.. _l-onnx-doc-Scatter: ======= Scatter ======= .. contents:: :local: .. _l-onnx-op-scatter-11: Scatter - 11 ============ **Version** * **name**: `Scatter (GitHub) `_ * **domain**: **main** * **since_version**: **11** * **function**: False * **support_level**: SupportType.COMMON * **shape inference**: True This version of the operator has been deprecated **since version 11**. **Summary** This operator is deprecated. Please use ScatterElements, which provides the same functionality. Scatter takes three inputs `data`, `updates`, and `indices` of the same rank r >= 1 and an optional attribute axis that identifies an axis of `data` (by default, the outer-most axis, that is axis 0). The output of the operation is produced by creating a copy of the input `data`, and then updating its value to values specified by `updates` at specific index positions specified by `indices`. Its output shape is the same as the shape of `data`. For each entry in `updates`, the target index in `data` is obtained by combining the corresponding entry in `indices` with the index of the entry itself: the index-value for dimension = axis is obtained from the value of the corresponding entry in `indices` and the index-value for dimension != axis is obtained from the index of the entry itself. For instance, in a 2-D tensor case, the update corresponding to the [i][j] entry is performed as below: :: output[indices[i][j]][j] = updates[i][j] if axis = 0, output[i][indices[i][j]] = updates[i][j] if axis = 1, This operator is the inverse of GatherElements. It is similar to Torch's Scatter operation. Example 1: :: data = [ [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], ] indices = [ [1, 0, 2], [0, 2, 1], ] updates = [ [1.0, 1.1, 1.2], [2.0, 2.1, 2.2], ] output = [ [2.0, 1.1, 0.0] [1.0, 0.0, 2.2] [0.0, 2.1, 1.2] ] Example 2: :: data = [[1.0, 2.0, 3.0, 4.0, 5.0]] indices = [[1, 3]] updates = [[1.1, 2.1]] axis = 1 output = [[1.0, 1.1, 3.0, 2.1, 5.0]] **Attributes** * **axis**: Which axis to scatter on. Negative value means counting dimensions from the back. Accepted range is [-r, r-1] where r = rank(data). Default value is ``0``. **Inputs** * **data** (heterogeneous) - **T**: Tensor of rank r >= 1. * **indices** (heterogeneous) - **Tind**: Tensor of int32/int64 indices, of r >= 1 (same rank as input). All index values are expected to be within bounds [-s, s-1] along axis of size s. It is an error if any of the index values are out of bounds. * **updates** (heterogeneous) - **T**: Tensor of rank r >=1 (same rank and shape as indices) **Outputs** * **output** (heterogeneous) - **T**: Tensor of rank r >= 1 (same rank as input). **Type Constraints** * **T** in ( tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) ): Input and output types can be of any tensor type. * **Tind** in ( tensor(int32), tensor(int64) ): Constrain indices to integer types **Examples** **_scatter_without_axis** :: node = onnx.helper.make_node( "Scatter", inputs=["data", "indices", "updates"], outputs=["y"], ) data = np.zeros((3, 3), dtype=np.float32) indices = np.array([[1, 0, 2], [0, 2, 1]], dtype=np.int64) updates = np.array([[1.0, 1.1, 1.2], [2.0, 2.1, 2.2]], dtype=np.float32) y = scatter(data, indices, updates) # print(y) produces # [[2.0, 1.1, 0.0], # [1.0, 0.0, 2.2], # [0.0, 2.1, 1.2]] expect( node, inputs=[data, indices, updates], outputs=[y], name="test_scatter_without_axis", opset_imports=[helper.make_opsetid("", 10)], ) **_scatter_with_axis** :: axis = 1 node = onnx.helper.make_node( "Scatter", inputs=["data", "indices", "updates"], outputs=["y"], axis=axis, ) data = np.array([[1.0, 2.0, 3.0, 4.0, 5.0]], dtype=np.float32) indices = np.array([[1, 3]], dtype=np.int64) updates = np.array([[1.1, 2.1]], dtype=np.float32) y = scatter(data, indices, updates, axis=axis) # print(y) produces # [[1.0, 1.1, 3.0, 2.1, 5.0]] expect( node, inputs=[data, indices, updates], outputs=[y], name="test_scatter_with_axis", opset_imports=[helper.make_opsetid("", 10)], ) **Differences** .. raw:: html
0Given data, updates and indices input tensors of rank r >= 1, write the values provided by updates
0This operator is deprecated. Please use ScatterElements, which provides the same functionality.
1
2Scatter takes three inputs data, updates, and indices of the same
3rank r >= 1 and an optional attribute axis that identifies an axis of data
4(by default, the outer-most axis, that is axis 0). The output of the operation
5is produced by creating a copy of the input data, and then updating its value
6to values specified by updates at specific index positions specified by
17into the first input, data, along axis dimension of data (by default outer-most one as axis=0) at corresponding indices.indices. Its output shape is the same as the shape of data.
8
29For each entry in updates, the target index in data is specified by corresponding entry in indicesFor each entry in updates, the target index in data is obtained by combining
10the corresponding entry in indices with the index of the entry itself: the
11index-value for dimension = axis is obtained from the value of the corresponding
312for dimension = axis, and index in source for dimension != axis. For instance, in a 2-D tensor case,entry in indices and the index-value for dimension != axis is obtained from the
413data[indices[i][j]][j] = updates[i][j] if axis = 0, or data[i][indices[i][j]] = updates[i][j] if axis = 1,index of the entry itself.
14
15For instance, in a 2-D tensor case, the update corresponding to the [i][j] entry
516where i and j are loop counters from 0 up to the respective size in updates - 1.is performed as below:
17::
18
619Example 1: output[indices[i][j]][j] = updates[i][j] if axis = 0,
7 data = [
820 [0.0, 0.0, 0.0], output[i][indices[i][j]] = updates[i][j] if axis = 1,
21
922 [0.0, 0.0, 0.0],This operator is the inverse of GatherElements. It is similar to Torch's Scatter operation.
23
24Example 1:
25::
26
27 data = [
1028 [0.0, 0.0, 0.0], [0.0, 0.0, 0.0],
11 ]
29 [0.0, 0.0, 0.0],
30 [0.0, 0.0, 0.0],
31 ]
1232 indices = [ indices = [
1333 [1, 0, 2], [1, 0, 2],
1434 [0, 2, 1], [0, 2, 1],
15 ]
35 ]
1636 updates = [ updates = [
1737 [1.0, 1.1, 1.2], [1.0, 1.1, 1.2],
1838 [2.0, 2.1, 2.2], [2.0, 2.1, 2.2],
19 ]
39 ]
2040 output = [ output = [
2141 [2.0, 1.1, 0.0] [2.0, 1.1, 0.0]
2242 [1.0, 0.0, 2.2] [1.0, 0.0, 2.2]
2343 [0.0, 2.1, 1.2] [0.0, 2.1, 1.2]
24 ]
44 ]
45
2546Example 2:Example 2:
47::
48
2649 data = [[1.0, 2.0, 3.0, 4.0, 5.0]] data = [[1.0, 2.0, 3.0, 4.0, 5.0]]
2750 indices = [[1, 3]] indices = [[1, 3]]
2851 updates = [[1.1, 2.1]] updates = [[1.1, 2.1]]
2952 axis = 1 axis = 1
3053 output = [[1.0, 1.1, 3.0, 2.1, 5.0]] output = [[1.0, 1.1, 3.0, 2.1, 5.0]]
3154
3255**Attributes****Attributes**
3356
3457* **axis**:* **axis**:
3558 Which axis to scatter on. Negative value means counting dimensions Which axis to scatter on. Negative value means counting dimensions
3659 from the back. Accepted range is [-r, r-1] Default value is 0. from the back. Accepted range is [-r, r-1] where r = rank(data). Default value is 0.
3760
3861**Inputs****Inputs**
3962
4063* **data** (heterogeneous) - **T**:* **data** (heterogeneous) - **T**:
4164 Tensor of rank r >= 1. Tensor of rank r >= 1.
4265* **indices** (heterogeneous) - **Tind**:* **indices** (heterogeneous) - **Tind**:
4366 Tensor of int32/int64 indices, of r >= 1 (same rank as input). Tensor of int32/int64 indices, of r >= 1 (same rank as input). All
67 index values are expected to be within bounds [-s, s-1] along axis
68 of size s. It is an error if any of the index values are out of
69 bounds.
4470* **updates** (heterogeneous) - **T**:* **updates** (heterogeneous) - **T**:
4571 Tensor of rank r >=1 (same rank and shape as indices) Tensor of rank r >=1 (same rank and shape as indices)
4672
4773**Outputs****Outputs**
4874
4975* **output** (heterogeneous) - **T**:* **output** (heterogeneous) - **T**:
5076 Tensor of rank r >= 1 (same rank as input). Tensor of rank r >= 1 (same rank as input).
5177
5278**Type Constraints****Type Constraints**
5379
5480* **T** in (* **T** in (
5581 tensor(bool), tensor(bool),
5682 tensor(complex128), tensor(complex128),
5783 tensor(complex64), tensor(complex64),
5884 tensor(double), tensor(double),
5985 tensor(float), tensor(float),
6086 tensor(float16), tensor(float16),
6187 tensor(int16), tensor(int16),
6288 tensor(int32), tensor(int32),
6389 tensor(int64), tensor(int64),
6490 tensor(int8), tensor(int8),
6591 tensor(string), tensor(string),
6692 tensor(uint16), tensor(uint16),
6793 tensor(uint32), tensor(uint32),
6894 tensor(uint64), tensor(uint64),
6995 tensor(uint8) tensor(uint8)
7096 ): ):
7197 Input and output types can be of any tensor type. Input and output types can be of any tensor type.
7298* **Tind** in (* **Tind** in (
7399 tensor(int32), tensor(int32),
74100 tensor(int64) tensor(int64)
75101 ): ):
76102 Constrain indices to integer types Constrain indices to integer types
.. _l-onnx-op-scatter-9: Scatter - 9 =========== **Version** * **name**: `Scatter (GitHub) `_ * **domain**: **main** * **since_version**: **9** * **function**: False * **support_level**: SupportType.COMMON * **shape inference**: True This version of the operator has been available **since version 9**. **Summary** Given `data`, `updates` and `indices` input tensors of rank r >= 1, write the values provided by `updates` into the first input, `data`, along `axis` dimension of `data` (by default outer-most one as axis=0) at corresponding `indices`. For each entry in `updates`, the target index in `data` is specified by corresponding entry in `indices` for dimension = axis, and index in source for dimension != axis. For instance, in a 2-D tensor case, data[indices[i][j]][j] = updates[i][j] if axis = 0, or data[i][indices[i][j]] = updates[i][j] if axis = 1, where i and j are loop counters from 0 up to the respective size in `updates` - 1. Example 1: data = [ [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], ] indices = [ [1, 0, 2], [0, 2, 1], ] updates = [ [1.0, 1.1, 1.2], [2.0, 2.1, 2.2], ] output = [ [2.0, 1.1, 0.0] [1.0, 0.0, 2.2] [0.0, 2.1, 1.2] ] Example 2: data = [[1.0, 2.0, 3.0, 4.0, 5.0]] indices = [[1, 3]] updates = [[1.1, 2.1]] axis = 1 output = [[1.0, 1.1, 3.0, 2.1, 5.0]] **Attributes** * **axis**: Which axis to scatter on. Negative value means counting dimensions from the back. Accepted range is [-r, r-1] Default value is ``0``. **Inputs** * **data** (heterogeneous) - **T**: Tensor of rank r >= 1. * **indices** (heterogeneous) - **Tind**: Tensor of int32/int64 indices, of r >= 1 (same rank as input). * **updates** (heterogeneous) - **T**: Tensor of rank r >=1 (same rank and shape as indices) **Outputs** * **output** (heterogeneous) - **T**: Tensor of rank r >= 1 (same rank as input). **Type Constraints** * **T** in ( tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) ): Input and output types can be of any tensor type. * **Tind** in ( tensor(int32), tensor(int64) ): Constrain indices to integer types