gpt4 book ai didi

r - 3D 数组 -> 应用 -> 3D 数组

转载 作者:行者123 更新时间:2023-12-02 22:53:46 27 4
gpt4 key购买 nike

当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑:

 arr <- array(
runif(2*4*3),
dim=c(2, 4, 3),
dimnames=list(a=paste0("a", 1:2), b=paste0("b", 1:4), c=paste0("c", 1:3))
)
# , , c = c1
#
# b
# a b1 b2 b3 b4
# a1 0.7321399 0.8851802 0.2469866 0.9307044
# a2 0.5896138 0.6183046 0.7732842 0.6652637
#
# , , c = c2
# b
# a b1 b2 b3 b4
# a1 0.5894680 0.7839048 0.3854357 0.56555024
# a2 0.6158995 0.6530224 0.8401427 0.04044974
#
# , , c = c3
# b
# a b1 b2 b3 b4
# a1 0.3500653 0.7052743 0.42487635 0.5689287
# a2 0.4097346 0.4527939 0.07192528 0.8638655

现在,创建一个 4 x 4 矩阵来打乱每个 arr[, , i] 中的列,并使用 apply 来矩阵乘以每个 a arr 中的 *b 子矩阵以重新排序其列。重要的一点是,每次 apply 迭代的结果都是一个矩阵

cols.shuf.mx <- matrix(c(0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0), ncol=4)
apply(arr, 3, `%*%`, cols.shuf.mx)
# c
# c1 c2 c3
# [1,] 0.8851802 0.78390483 0.70527431
# [2,] 0.6183046 0.65302236 0.45279387
# [3,] 0.7321399 0.58946800 0.35006532
# [4,] 0.5896138 0.61589947 0.40973463
# [5,] 0.9307044 0.56555024 0.56892870
# [6,] 0.6652637 0.04044974 0.86386552
# [7,] 0.2469866 0.38543569 0.42487635
# [8,] 0.7732842 0.84014275 0.07192528

然而,我期望的结果是:

# , , c = c1
#
# a 1 2 3 4
# a1 0.8851802 0.7321399 0.9307044 0.2469866
# a2 0.6183046 0.5896138 0.6652637 0.7732842
#
# , , c = c2
#
# a 1 2 3 4
# a1 0.7839048 0.5894680 0.56555024 0.3854357
# a2 0.6530224 0.6158995 0.04044974 0.8401427
#
# , , c = c3
#
# a 1 2 3 4
# a1 0.7052743 0.3500653 0.5689287 0.42487635
# a2 0.4527939 0.4097346 0.8638655 0.07192528

我可以使用 plyr::aaply 获得预期结果:

aperm(aaply(arr, 3, `%*%`, cols.shuf.mx), c(2, 3, 1))

但想知道是否有一个简单基本方法来实现这个结果(即我是否在这里遗漏了一些明显的东西来获得所需的结果)。

我意识到这里发生的事情就是记录的(如果每次调用 FUN 返回一个长度为 n 的向量,那么 apply 返回一个维度为 c(n, dim(X)[MARGIN]) 的数组,如果 n > 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。

最佳答案

这是一个不太理想的解决方案,需要预先了解函数结果矩阵的维度:

vapply(
1:dim(arr)[3],
function(x, y) arr[,,x] %*% y,
FUN.VALUE=arr[,,1],
y=cols.shuf.mx
)

关于r - 3D 数组 -> 应用 -> 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21196818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com