使用置换轴转置多维
tranpose of multidimension with permute the axes
对于更高维的数组,转置将接受一个轴数元组来排列轴(额外的思维弯曲):
In [115]: arr = np.arange(16).reshape((2, 2, 4))
In [116]: arr
Out[116]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
In [117]: arr.transpose((1, 0, 2))
Out[117]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
我试图了解如何为转置 ((1, 0, 2) 生成上述输出。我无法理解排列轴的含义?要求以通俗易懂的方式解释上述输出已生成。
谢谢
默认转置是反转坐标轴,因此 A x B
矩阵变为 B x A
。对于 3D,默认设置是将 A x B x C
转置为 C x B x A
。
在您的示例中,transpose(1, 0, 2)
,它将 A x B x C
转置为 B x A x C
。那是因为默认的 3D 转置是 (2, 1, 0)
,但你有 (1, 0, 2)
,它只是交换前两个轴。
当您进行实验时,如果您使用形状为 2 x 3 x 4
的示例数组或其他没有重复项的组合,可能会更清楚。
转置矩阵本质上是切换维度的顺序,例如:arr.transpose()
在这种情况下等于 arr.transpose((2,1,0))
。
另一方面,如果您希望手动 select 维度的顺序,您将通过 arr.transpose((0,1,2))
转置来保留原始顺序(即不要更改任何内容)。
在您的示例中,您保留了数组的最后一个维度 (2),例如[0,1,2,3]
,不变。但是,您将前两个(0 和 1)调换,因此 arr[0,0,0:4]
处的元素仍然存在,但 arr[1,0,0:4]
的内容现在在转置后出现在 arr[0,1,0:4]
处:
In[]: t_arr = arr.transpose((1,0,2))
In[]: arr[0,0,0:4] == t_arr[0,0,0:4]
Out[]:
array([ True, True, True, True], dtype=bool)
In[]: arr[0,1,0:4] == t_arr[1,0,0:4] # indices #0,1,0-3 and #1,0,0-3 respectively
Out[]:
array([ True, True, True, True], dtype=bool)
这也是您在转置多维矩阵时所期望的。轴以某种方式交换,因此元素位于与以前几乎相同的索引处,只是交换顺序,即:
arr[x,y,z] == arr.transpose()[z,y,x] # True
arr[x,y,z] == arr.transpose((1,0,2))[y,x,z] # True (your case)
考虑一个数组及其转置:
arr = np.arange(24).reshape((2, 3, 4))
arrt = arr.transpose((1, 0, 2))
默认情况下 transpose
只是颠倒维度的顺序。上面的特定转置命令交换前两个维度,但保留最后一个维度不变。让我们通过几个例子来验证一下:
print(arr.shape)
# (2, 3, 4)
print(arrt.shape)
# (3, 2, 4)
# the last dimension is the same in both arrays
print(arr[0, 0, :])
# [0 1 2 3]
print(arrt[0, 0, :])
# [0 1 2 3]
print(arr[:, 0, 0]) # what was before the first dimension
# [ 0 12]
print(arrt[0, :, 0]) # is now the second dimension
# [ 0 12]
# the first two dimensions are swapped - the submatrix is transposed
print(arr[:, :, 0])
# [[ 0 4 8]
# [12 16 20]]
print(arrt[:, :, 0])
# [[ 0 12]
# [ 4 16]
# [ 8 20]]
对于更高维的数组,转置将接受一个轴数元组来排列轴(额外的思维弯曲):
In [115]: arr = np.arange(16).reshape((2, 2, 4))
In [116]: arr
Out[116]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
In [117]: arr.transpose((1, 0, 2))
Out[117]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
我试图了解如何为转置 ((1, 0, 2) 生成上述输出。我无法理解排列轴的含义?要求以通俗易懂的方式解释上述输出已生成。
谢谢
默认转置是反转坐标轴,因此 A x B
矩阵变为 B x A
。对于 3D,默认设置是将 A x B x C
转置为 C x B x A
。
在您的示例中,transpose(1, 0, 2)
,它将 A x B x C
转置为 B x A x C
。那是因为默认的 3D 转置是 (2, 1, 0)
,但你有 (1, 0, 2)
,它只是交换前两个轴。
当您进行实验时,如果您使用形状为 2 x 3 x 4
的示例数组或其他没有重复项的组合,可能会更清楚。
转置矩阵本质上是切换维度的顺序,例如:arr.transpose()
在这种情况下等于 arr.transpose((2,1,0))
。
另一方面,如果您希望手动 select 维度的顺序,您将通过 arr.transpose((0,1,2))
转置来保留原始顺序(即不要更改任何内容)。
在您的示例中,您保留了数组的最后一个维度 (2),例如[0,1,2,3]
,不变。但是,您将前两个(0 和 1)调换,因此 arr[0,0,0:4]
处的元素仍然存在,但 arr[1,0,0:4]
的内容现在在转置后出现在 arr[0,1,0:4]
处:
In[]: t_arr = arr.transpose((1,0,2))
In[]: arr[0,0,0:4] == t_arr[0,0,0:4]
Out[]:
array([ True, True, True, True], dtype=bool)
In[]: arr[0,1,0:4] == t_arr[1,0,0:4] # indices #0,1,0-3 and #1,0,0-3 respectively
Out[]:
array([ True, True, True, True], dtype=bool)
这也是您在转置多维矩阵时所期望的。轴以某种方式交换,因此元素位于与以前几乎相同的索引处,只是交换顺序,即:
arr[x,y,z] == arr.transpose()[z,y,x] # True
arr[x,y,z] == arr.transpose((1,0,2))[y,x,z] # True (your case)
考虑一个数组及其转置:
arr = np.arange(24).reshape((2, 3, 4))
arrt = arr.transpose((1, 0, 2))
默认情况下 transpose
只是颠倒维度的顺序。上面的特定转置命令交换前两个维度,但保留最后一个维度不变。让我们通过几个例子来验证一下:
print(arr.shape)
# (2, 3, 4)
print(arrt.shape)
# (3, 2, 4)
# the last dimension is the same in both arrays
print(arr[0, 0, :])
# [0 1 2 3]
print(arrt[0, 0, :])
# [0 1 2 3]
print(arr[:, 0, 0]) # what was before the first dimension
# [ 0 12]
print(arrt[0, :, 0]) # is now the second dimension
# [ 0 12]
# the first two dimensions are swapped - the submatrix is transposed
print(arr[:, :, 0])
# [[ 0 4 8]
# [12 16 20]]
print(arrt[:, :, 0])
# [[ 0 12]
# [ 4 16]
# [ 8 20]]