如何在R语言中对向量化张量进行重新排序?
R语言中张量向量化后的重新排序问题
假设我们有一个维度为RST的向量化张量:
A <- c(a111, a112, a113, ..., a11T, a121, ..., a1ST, a211, ..., aRST)
其元素顺序为:固定i(第一个维度),遍历j(第二个维度),每个j下遍历k(第三个维度);再递增i,重复上述过程。
现在需要将其重新排序为以下顺序:
c(a111, a211, ..., aR11, a112, a212, ..., aR12, ..., aRST)
即固定j和k,遍历i;再递增k,固定j遍历i;最后递增j,重复上述过程。
现有思路的问题
我尝试将A转换为数组:
Arr <- array(A, dim = c(R, S, T))
但不确定后续如何重新向量化,也担心效率问题。c(Arr)默认按列优先展开(第一个维度变化最快),无法指定展开轴;expand.grid()也不适用,因为它默认让第一个因子变化最快,不符合需求。
解决方案
可以用aperm()调整数组的维度顺序,再用c()向量化,这是高效的实现方式:
# 1. 将原始向量转换为数组,维度对应R*S*T Arr <- array(A, dim = c(R, S, T)) # 2. 调整维度顺序:将原数组的第二、第三维度交换,得到(R, T, S)的数组 # 此时第一个维度(R)变化最快,第三个维度(S)变化最慢,符合目标顺序 Arr_reordered <- aperm(Arr, c(1, 3, 2)) # 3. 向量化得到目标序列 target_A <- c(Arr_reordered)
说明
aperm()是R中专门用于调整数组维度顺序的函数,底层由C实现,处理大张量时效率很高,远优于手动循环或其他低效方法。- 调整维度顺序后,
c()的默认列优先展开正好匹配我们需要的元素顺序:先遍历i(R维度),再遍历k(T维度),最后遍历j(S维度)。
内容的提问来源于stack exchange,提问作者Chp
相关产品推荐
相关产品推荐

