如何转置高维张量的子矩阵?

4
假设我有一个大小为[1:92, 1:13, 1:2000]的张量,我需要转置每个1:92矩阵,并将我的张量重塑为[1:92, 1:2000, 1:13]。 当然,我可以使用循环,分别转置每个矩阵并将它们组合成一个新的张量,但我的直觉告诉我应该有一种更优雅的方法来完成这个任务。 Sweep函数似乎是正确的方向,我已经尝试了几个小时来解决它,但想不出更好的办法。

1
我再告诉你一遍,追加问题不是这里提问的方式。请发布一个新问题。这不是一个论坛。 - Julius Vainora
你确定这里吗?我得再发一遍第一个问题,因为就像我之前提到的那样,这只有在使用 aperm 进行转置并跟随重塑时才会出现。 - Eugen
是的。最初的问题是关于转置,现在你想要删除一个维度。这是非常不同的。另外,“顺序需要保持列在行之前”不清楚,你需要提供示例数据和预期输出(请参见https://dev59.com/eG025IYBdhLWcg3whGSx)。而且,你不需要再写一遍第一个问题,因为你已经有了解决方案,必须在问题中提到。此外,你可以这样想:如果你的新的、**明确说明**的问题不适合作为评论,那么它应该是一个新的问题。 - Julius Vainora
1个回答

4
是的,有一个很好的方法可以做到这一点:
aperm(A, c(1, 3, 2))

其中,A 代表你的数组,c(1,3,2) 表示 A 的维度应该如何重新排列。

例如:

A <- array(1:(2 * 3 * 4), 2:4)
dim(A)
# [1] 2 3 4
A[1, , ]
#      [,1] [,2] [,3] [,4]
# [1,]    1    7   13   19
# [2,]    3    9   15   21
# [3,]    5   11   17   23
B <- aperm(A, c(1, 3, 2))
dim(B)
# [1] 2 4 3
B[1, , ]
#      [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    7    9   11
# [3,]   13   15   17
# [4,]   19   21   23

谢谢!这需要在 R 指南中更经常地提到。 - Eugen
再次感谢。我的绕路会涉及到一个循环,将两个轴连接在一起,或者一些模运算也可以吧。 - Eugen
似乎这也不起作用,它给我提供了与array_reshape(B, dim=c(2*4, 3))相同的结果,但顺序有误,我也尝试过在aperm之前使用apply。aperm与轴缩减的组合似乎有问题。 - Eugen
抱歉,我懒得找出如何在评论中发布代码,不熟悉这里的系统,现在已经删除了。一旦我达到15个声望,我也会为您的答案投票。我真的没有提到顺序应该保持不变。 - Eugen
显然,我的后续问题只在那种情况下才出现。仅仅是数组重塑和/或删除轴不会导致任何排序问题,但与“子矩阵”的转置结合使用会导致后续排序问题。 - Eugen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接