首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变轴向的多维变换

改变轴向的多维变换
EN

Stack Overflow用户
提问于 2017-05-22 12:01:33
回答 3查看 592关注 0票数 0

对于高维数组,转置将接受一个轴数的元组来改变轴(对于额外的精神弯曲):

代码语言:javascript
复制
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)生成上述输出。我不明白是什么意思是改变了斧头?要求用非专业术语解释上述输出是如何产生的。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-22 12:20:32

默认的转置是反转轴,因此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的示例数组或没有重复项的其他组合,可能会更清楚。

票数 1
EN

Stack Overflow用户

发布于 2017-05-22 12:23:07

转换矩阵本质上就是转换维度的顺序,例如:在这种情况下,arr.transpose()等于arr.transpose((2,1,0))

另一方面,如果您希望手动选择维度的顺序,您将保留原来的顺序(即,不要更改任何东西),方法是使用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]

代码语言:javascript
复制
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)

这也是您在转换多维矩阵时所期望的。轴是以一种方式交换的,因此元素的位置与以前几乎相同,只是以交换的顺序排列,即:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2017-05-22 12:28:53

考虑一个数组及其转置:

代码语言:javascript
复制
arr = np.arange(24).reshape((2, 3, 4))
arrt = arr.transpose((1, 0, 2))

默认情况下,transpose只是颠倒维度的顺序。上面的特殊transpose命令交换了前两个维度,但保留了最后一个维度。让我们在几个例子中进行验证:

代码语言:javascript
复制
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]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44112360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档