我很难理解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]]])
如何手动推导此转置?我需要在上述情况下直观地理解公式或步骤,以便我可以将其推广到更高的维度。
答案 0 :(得分:14)
<强>
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, x
或sheets, 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) -- 请交换最后两个轴。