numpy.transpose如何为此示例工作?

时间:2015-10-13 10:47:50

标签: python numpy transpose

我很难理解numpy.transpose的实际效果。 例如

a_value = array([[[0, 1],
                  [2, 3]],

                 [[4, 5],
                  [6, 7]]])

当我做的时候

np.transpose(a_value, (2, 1, 0))

我得到了

array([[[0, 4],
        [2, 6]],

       [[1, 5],
        [3, 7]]])

如何手动推导此转置?我需要在上述情况下直观地理解公式或步骤,以便我可以将其推广到更高的维度。

3 个答案:

答案 0 :(得分:14)

documentation -

中所述
  

<强> numpy.transpose(a, axes=None)

     

轴:整数列表,可选   默认情况下,反转尺寸,否则根据给定的值置换轴。

第二个参数是用于置换值的轴。例如,如果初始元素的索引是(x,y,z)(其中x是第0轴,y是第1轴,z是第2轴),则位置根据您为axes提供的参数,结果数组中的元素变为(z,y,x)(即第2个轴,然后是第1个轴,最后是第0个轴)。

由于您正在转置形状(2,2,2)的数组,因此转置的形状也为(2,2,2),并且位置将更改为 -

(0,0,0) -> (0,0,0)
(1,0,0) -> (0,0,1)
(0,1,0) -> (0,1,0)
(1,1,0) -> (0,1,1)
...

由于您选择的轴很小,让我们为另一个轴解释一下。示例 -

In [54]: A = np.arange(30).reshape((2, 3, 5))
In [55]: A
Out[55]:
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14]],

       [[15, 16, 17, 18, 19],
        [20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29]]])

In [56]: np.transpose(A,(1,2,0))
Out[56]:
array([[[ 0, 15],
        [ 1, 16],
        [ 2, 17],
        [ 3, 18],
        [ 4, 19]],

       [[ 5, 20],
        [ 6, 21],
        [ 7, 22],
        [ 8, 23],
        [ 9, 24]],

       [[10, 25],
        [11, 26],
        [12, 27],
        [13, 28],
        [14, 29]]])

此处,第一个元素(0,0,0)成为结果中的(0,0,0)元素。

第二个元素(0,0,1)成为结果中的(0,1,0)元素。等等 -

(0,0,0) -> (0,0,0)
(0,0,1) -> (0,1,0)
(0,0,2) -> (0,2,0)
...
(2,3,4) -> (3,4,2)
...

答案 1 :(得分:1)

这里需要更多说明:

不要混淆np.reshape(z, y, x)np.transpose(0, 1, 2)的参数。

np.reshape()使用矩阵的尺寸,以(sheets, rows, columns)为例,指定其布局。

np.transpose()使用整数0、1和2表示我们要交换的轴,分别对应于z,y和x。

例如,如果我们有2张,3行和5列的矩阵数据……

我们可以采取下一步行动,并从清单的角度进行思考。因此,2x3x5矩阵的z, y, xsheets, rows, columns表示是...

 [[[ 0,  1,  2,  3,  4],
    [ 5,  6,  7,  8,  9],
    [10, 11, 12, 13, 14]],

   [[15, 16, 17, 18, 19],
    [20, 21, 22, 23, 24],
    [25, 26, 27, 28, 29]]]

...但是我们要将数据馈入的模块需要这样的布局,即工作表1包含每个工作表的第一行,工作表2包含第二行,依此类推。然后,我们需要使用np.transpose(1,0,2)转置数据。这样将交换z和y轴并转置数据。

 [[[ 0,  1,  2,  3,  4],
   [15, 16, 17, 18, 19]],

  [[ 5,  6,  7,  8,  9],
   [20, 21, 22, 23, 24]],

  [[10, 11, 12, 13, 14],
   [25, 26, 27, 28, 29]]]

请注意与使用np.reshape(3,2,5)的区别,因为它不会转置数据-只是重新排列数据。

[[[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9]],

 [[10, 11, 12, 13, 14],
  [15, 16, 17, 18, 19]],

 [[20, 21, 22, 23, 24],
  [25, 26, 27, 28, 29]]]

答案 2 :(得分:0)

axes= 参数是您希望起始轴在结果中的排列方式。

在我的例子中,我有一个形状为 (2, 1997, 4, 4) 的数组,我只想转置 (4, 4) 子数组。

axes=() 这里需要 4 个参数,每个轴一个。 axis=(0, 1, 2, 3) 没有变化,因为请求的结果顺序与开始顺序相同。

要根据需要仅转置 (4,4) 数组,我使用 axes=(0, 1, 3, 2) -- 请交换最后两个轴。

相关问题