reshape

paddle.reshape ( x, shape, name=None ) [源代码]

该OP在保持输入 x 数据不变的情况下,改变 x 的形状。

请注意,在动态图模式下,输出Tensor将与输入Tensor共享数据,并且没有Tensor数据拷贝的过程。 如果不希望输入与输出共享数据,请使用 Tensor.clone ,例如 reshape_clone_x = x.reshape([-1]).clone() 。

在指定目标shape时存在一些技巧:

  1. 1. -1 表示这个维度的值是从x的元素总数和剩余维度推断出来的。因此,有且只有一个维度可以被设置为-1
  2. 2. 0 表示实际的维数是从x的对应维数中复制出来的,因此shape0的索引值不能超过x的维度。

这里有一些例子来解释它们:

  1. 1. 给定一个形状为[2,4,6]的三维张量x,目标形状为[6,8],则将x变换为形状为[6,8]的2-D张量,且x的数据保持不变。
  2. 2. 给定一个形状为[2,4,6]的三维张量x,目标形状为[2,3,-1,2],则将x变换为形状为[2,3,4,2]的4-D张量,且x的数据保持不变。在这种情况下,目标形状的一个维度被设置为-1,这个维度的值是从x的元素总数和剩余维度推断出来的。
  3. 3. 给定一个形状为[2,4,6]的三维张量x,目标形状为[-1,0,3,2],则将x变换为形状为[2,4,3,2]的4-D张量,且x的数据保持不变。在这种情况下,0对应位置的维度值将从x的对应维数中复制,-1对应位置的维度值由x的元素总数和剩余维度推断出来。

参数:

  • x (Tensor)- N-D Tensor,数据类型为 float32float64int32int64 或者 bool

  • shape (list|tuple|Tensor)- 数据类型是 int32 。定义目标形状。目标形状最多只能有一个维度为-1。如果 shape 的类型是 list 或 tuple, 它的元素可以是整数或者形状为[1]的 Tensor。如果 shape 的类型是 Tensor,则是1-D的 Tensor

  • name (str,可选)- 默认值为 None, 一般不需要设置。 具体用法请参见 Name

返回:

Tensor,改变形状后的 Tensor,数据类型与 x 相同。

代码示例

  1. import numpy as np
  2. import paddle
  3. x = paddle.rand([2, 4, 6], dtype="float32")
  4. positive_four = paddle.full([1], 4, "int32")
  5. out = paddle.reshape(x, [-1, 0, 3, 2])
  6. print(out)
  7. # the shape is [2,4,3,2].
  8. out = paddle.reshape(x, shape=[positive_four, 12])
  9. print(out)
  10. # the shape of out_2 is [4, 12].
  11. shape_tensor = paddle.to_tensor(np.array([8, 6]).astype("int32"))
  12. out = paddle.reshape(x, shape=shape_tensor)
  13. print(out)
  14. # the shape is [8, 6].
  15. # 在动态图模式下,输出out与输入x共享数据
  16. x[0, 0, 0] = 10.
  17. print(out[0, 0])
  18. # the value is [10.]