numpy.swapaxes如何工作?

pho*_*nix 7 python arrays numpy reshape

我创建了一个示例数组:

a = np.arange(18).reshape(9,2)
Run Code Online (Sandbox Code Playgroud)

在打印时,我将其作为输出:

[[ 0  1]
[ 2  3]
[ 4  5]
[ 6  7]
[ 8  9]
[10 11]
[12 13]
[14 15]
[16 17]]
Run Code Online (Sandbox Code Playgroud)

在执行此重塑时:

b = a.reshape(2,3,3).swapaxes(0,2)
Run Code Online (Sandbox Code Playgroud)

我明白了:

[[[ 0  9]
[ 3 12]
[ 6 15]]

[[ 1 10]
[ 4 13]
[ 7 16]]

[[ 2 11]
[ 5 14]
[ 8 17]]]
Run Code Online (Sandbox Code Playgroud)

我经历了这个问题,但它并没有解决我的问题.

在NumPy中重塑一个数组

文档也没用.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.swapaxes.html

我需要知道交换是如何工作的(x轴,y轴,z轴).图解说明最有帮助.

hpa*_*ulj 13

从重塑开始

In [322]: a = np.arange(18).reshape(2,3,3)
In [323]: a
Out[323]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])
Run Code Online (Sandbox Code Playgroud)

这显示为2个平面,每个平面为3x3.那部分清楚了吗?阵列在一点上成形(9,2)的事实并不重要.重塑不会改变元素的顺序.

适用swapaxes.形状现在是(3,3,2).3个飞机,每个是3x2.此特定交换与转置相同

np.arange(18).reshape(2,3,3).transpose(2,1,0)
Run Code Online (Sandbox Code Playgroud)

中轴不变.还有[0,3,6],[9,12,15]等列.

使用3个不同尺寸的轴可视化更改可能更容易

In [335]: a=np.arange(2*3*4).reshape(2,3,4)
In [336]: a
Out[336]: 
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]]])
In [337]: a.swapaxes(0,2)
Out[337]: 
array([[[ 0, 12],
        [ 4, 16],
        [ 8, 20]],

       [[ 1, 13],
        [ 5, 17],
        [ 9, 21]],

       [[ 2, 14],
        [ 6, 18],
        [10, 22]],

       [[ 3, 15],
        [ 7, 19],
        [11, 23]]])
Run Code Online (Sandbox Code Playgroud)

注意当我压平阵列时会发生什么

In [338]: a.swapaxes(0,2).ravel()
Out[338]: 
array([ 0, 12,  4, 16,  8, 20,  1, 13,  5, 17,  9, 21,  2, 14,  6, 18, 10,
       22,  3, 15,  7, 19, 11, 23])
Run Code Online (Sandbox Code Playgroud)

条款的顺序已被洗牌.创建时它是[0,1,2,3 ...].现在1是第6个学期(2x3).

在封面下numpy实际上通过更改来执行交换或转置shape,strides并且order不更改数据缓冲区(即它是视图).但进一步的重塑,包括散乱,迫使它制作副本.但在这个阶段,这可能比有用更令人困惑.

numpy轴上编号.诸如x,y,z或平面,行,列之类的术语可以帮助您将这些术语映射到您可以可视化的构造,但它们不是"内置"的.用文字描述交换或转置是棘手的.


Goi*_*Way 10

这是我的理解 swapaxes

假设你有一个数组

In [1]: arr = np.arange(16).reshape((2, 2, 4))

In [2]: arr
Out[2]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
Run Code Online (Sandbox Code Playgroud)

的形状arr(2, 2, 4),对于该值7,您可以通过

In [3]: arr[0, 1, 3]
Out[3]: 7
Run Code Online (Sandbox Code Playgroud)

现在有3个轴0、1和2,我们交换轴0和2

In [4]: arr_swap = arr.swapaxes(0, 2)

In [5]: arr_swap
Out[5]: 
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])
Run Code Online (Sandbox Code Playgroud)

您可以猜到,的索引7(3, 1, 0),轴1不变,

In [6]: arr_swap[3, 1, 0]
Out[6]: 7
Run Code Online (Sandbox Code Playgroud)

因此,现在从索引的角度来看,交换轴只是更改值的索引。例如

In [7]: arr[0, 0, 1]
Out[7]: 1

In [8]: arr_swap[1, 0, 0]
Out[8]: 1

In [9]: arr[0, 1, 2]
Out[9]: 6

In [9]: arr_swap[2, 1, 0]
Out[9]: 6
Run Code Online (Sandbox Code Playgroud)

因此,如果您难以获得交换轴数组,只需更改索引,例如arr_swap[2, 1, 0] = arr[0, 1, 2]

  • 你的思维方式真是天才。我刚刚连续努力了 4 个小时,但现在我掌握了全部数学知识。 (3认同)