jax.lax.scatter#
- jax.lax.scatter(operand, scatter_indices, updates, dimension_numbers, *, indices_are_sorted=False, unique_indices=False, mode=None)[源代码]#
散布更新运算符。
封装了XLA 的 Scatter 运算符,其中更新会替换operand中的值。
如果对 operand 的同一索引执行多次更新,则可以按任何顺序应用它们。
scatter()
是一个具有复杂语义的低级运算符,大多数 JAX 用户永远不需要直接调用它。相反,您应该首选使用jax.numpy.ndarray.at()
以获得更熟悉的 NumPy 风格的索引语法。- 参数:
operand (ArrayLike) – 应用散布的数组
scatter_indices (ArrayLike) – 一个数组,给出 operand 中每个 updates 中的更新应该应用的索引。
updates (ArrayLike) – 应该散布到 operand 上的更新。
dimension_numbers (ScatterDimensionNumbers) – 一个 lax.ScatterDimensionNumbers 对象,描述了 operand、start_indices、updates 和输出的维度之间的关系。
indices_are_sorted (bool) – scatter_indices 是否已知已排序。如果为 true,可能会提高某些后端上的性能。
unique_indices (bool) –
operand
中要更新的元素是否保证彼此不重叠。如果为 true,可能会提高某些后端上的性能。JAX 不会检查此承诺:如果当unique_indices
为True
时更新的元素重叠,则行为未定义。mode (str | GatherScatterMode | None | None) – 如何处理超出范围的索引:当设置为“clip”时,索引将被钳制,以便切片在边界内;当设置为“fill”或“drop”时,超出范围的更新将被丢弃。当设置为“promise_in_bounds”时,超出范围索引的行为是实现定义的。
- 返回:
一个包含 operand 和散布更新的总和的数组。
- 返回类型:
示例
如上所述,您基本上永远不应该直接使用
scatter()
,而是通过jax.numpy.ndarray.at
使用 NumPy 风格的索引表达式来执行散布风格的操作。这是一个使用
jax.numpy.ndarray.at
更新数组中条目的示例,它会降低为 XLA Scatter 操作>>> x = jnp.zeros(5) >>> indices = jnp.array([1, 2, 4]) >>> values = jnp.array([2.0, 3.0, 4.0])
>>> x.at[indices].set(values) Array([0., 2., 3., 0., 4.], dtype=float32)
此语法还支持
scatter()
的几个可选参数,例如>>> x.at[indices].set(values, indices_are_sorted=True, mode='promise_in_bounds') Array([0., 2., 3., 0., 4.], dtype=float32)
相比之下,这里是直接使用
scatter()
的等效函数调用,这不是典型用户应该做的事情>>> lax.scatter(x, indices[:, None], values, ... dimension_numbers=lax.ScatterDimensionNumbers( ... update_window_dims=(), ... inserted_window_dims=(0,), ... scatter_dims_to_operand_dims=(0,)), ... indices_are_sorted=True, ... mode=lax.GatherScatterMode.PROMISE_IN_BOUNDS) Array([0., 2., 3., 0., 4.], dtype=float32)