numpy.transpose 如何适用于此示例?

How does numpy.transpose work for this example?

我很难理解 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]]])

如何手动推导出这个转置?我需要直观地理解上述案例中的公式或步骤,以便将其推广到更高的维度。

documentation -

中所示

numpy.transpose(a, axes=None)

axes : list of ints, optional By default, reverse the dimensions, otherwise permute the axes according to the values given.

第二个参数是排列值所使用的轴。例如,如果初始元素的索引是 (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)
...

这里有更多的说明:

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

np.reshape() 使用我们矩阵的维度,想想 (sheets, rows, columns),来指定它的布局。

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

例如,如果我们有 2 sheet 个 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]]]

...但是我们将此数据输入的模块需要一个布局,使得 sheet 1 包含我们每个 sheet 和 sheet 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]]]

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

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

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

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