numpy.swapaxes 是如何运作的?
How does numpy.swapaxes work?
我创建了一个示例数组:
a = np.arange(18).reshape(9,2)
在打印时,我将其作为输出:
[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]
[12 13]
[14 15]
[16 17]]
执行此整形时:
b = a.reshape(2,3,3).swapaxes(0,2)
我得到:
[[[ 0 9]
[ 3 12]
[ 6 15]]
[[ 1 10]
[ 4 13]
[ 7 16]]
[[ 2 11]
[ 5 14]
[ 8 17]]]
我回答了这个问题,但它并没有解决我的问题。
Reshape an array in NumPy
文档也没有用。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.swapaxes.html
我需要知道交换是如何工作的(即 x 轴、y 轴、z 轴)。图表解释将是最有帮助的。
从整形开始
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]]])
这显示为 2 个平面,每个平面都是 3x3。那部分清楚了吗?数组在某一点的形状为 (9,2) 的事实并不重要。重塑不会改变元素的顺序。
应用swapaxes
。形状现在是 (3,3,2)。 3 个平面,每个平面为 3x2。这个特定的交换与转置相同
np.arange(18).reshape(2,3,3).transpose(2,1,0)
中轴不变。还有[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]]])
注意当我展平数组时会发生什么
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])
术语顺序已打乱。创建时它是 [0,1,2,3...]。现在 1
是第 6 项 (2x3)。
在幕后 numpy
实际上通过更改 shape
、strides
和 order
执行交换或转置,而不更改数据缓冲区(即它是一个视图) .但进一步的重塑,包括重塑,迫使它制作一个副本。但在这个阶段,这可能比帮助更令人困惑。
在 numpy
中轴被编号。 x、y、z 或平面、行、列等术语可能会帮助您将它们映射到您可以想象的结构上,但它们不是 'built-in'。用文字描述交换或转置很棘手。
这是我对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]]])
而arr
的形状是(2, 2, 4)
,对于值7
,可以通过
得到值
In [3]: arr[0, 1, 3]
Out[3]: 7
有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]]])
如您所料,7
的索引为 (3, 1, 0)
,轴 1
不变,
In [6]: arr_swap[3, 1, 0]
Out[6]: 7
所以,现在从索引的角度来看,交换轴只是改变索引的值。例如
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
所以,如果你觉得swapped-axis数组很难获取,就改变索引,比如arr_swap[2, 1, 0] = arr[0, 1, 2]
。
我创建了一个示例数组:
a = np.arange(18).reshape(9,2)
在打印时,我将其作为输出:
[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]
[12 13]
[14 15]
[16 17]]
执行此整形时:
b = a.reshape(2,3,3).swapaxes(0,2)
我得到:
[[[ 0 9]
[ 3 12]
[ 6 15]]
[[ 1 10]
[ 4 13]
[ 7 16]]
[[ 2 11]
[ 5 14]
[ 8 17]]]
我回答了这个问题,但它并没有解决我的问题。
Reshape an array in NumPy
文档也没有用。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.swapaxes.html
我需要知道交换是如何工作的(即 x 轴、y 轴、z 轴)。图表解释将是最有帮助的。
从整形开始
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]]])
这显示为 2 个平面,每个平面都是 3x3。那部分清楚了吗?数组在某一点的形状为 (9,2) 的事实并不重要。重塑不会改变元素的顺序。
应用swapaxes
。形状现在是 (3,3,2)。 3 个平面,每个平面为 3x2。这个特定的交换与转置相同
np.arange(18).reshape(2,3,3).transpose(2,1,0)
中轴不变。还有[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]]])
注意当我展平数组时会发生什么
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])
术语顺序已打乱。创建时它是 [0,1,2,3...]。现在 1
是第 6 项 (2x3)。
在幕后 numpy
实际上通过更改 shape
、strides
和 order
执行交换或转置,而不更改数据缓冲区(即它是一个视图) .但进一步的重塑,包括重塑,迫使它制作一个副本。但在这个阶段,这可能比帮助更令人困惑。
在 numpy
中轴被编号。 x、y、z 或平面、行、列等术语可能会帮助您将它们映射到您可以想象的结构上,但它们不是 'built-in'。用文字描述交换或转置很棘手。
这是我对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]]])
而arr
的形状是(2, 2, 4)
,对于值7
,可以通过
In [3]: arr[0, 1, 3]
Out[3]: 7
有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]]])
如您所料,7
的索引为 (3, 1, 0)
,轴 1
不变,
In [6]: arr_swap[3, 1, 0]
Out[6]: 7
所以,现在从索引的角度来看,交换轴只是改变索引的值。例如
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
所以,如果你觉得swapped-axis数组很难获取,就改变索引,比如arr_swap[2, 1, 0] = arr[0, 1, 2]
。