问题:给定一个多维数组,将其元素在某些选定的维度中洗牌。理想情况下,数组应该 in situ /就位,因为第二个可能不适合我的记忆。
例如,给定一个包含4个维度的数组a
,为所有a[x,y,z,]
分配给每个a[x2,y2,z2,]
另一个值x,y,z
,其中x2,y2,z2
是随机选择的来自各自维度的指数集。
示例数组:
set.seed(1)
a <- array(data=sample(1:9, size=3*3*3*2, replace=T), dim=c(3,3,3,2))
在R中使用3个嵌套for循环是否有更有效的方法?我试过的天真的方法:
x.rand <- floor(runif( n=3, min = 1, max = 3 + 1)); # max and min will not be generated by runif()
y.rand <- floor(runif( n=3, min = 1, max = 3 + 1));
z.rand <- floor(runif( n=3, min = 1, max = 3 + 1));
for( i in 1:3) {
for( j in 1:3) {
for( k in 1:3) {
tmp <- a[i,j,k, ];
a[i,j,k,] <- a[x.rand[i], y.rand[j], z.rand[k], ];
a[x.rand[i], y.rand[j], z.rand[k], ] <- tmp;
}
}
}
但对于较大的阵列,我遇到了性能问题。
答案 0 :(得分:3)
我认为Pop在删除答案之前有正确的想法,但如果您不想删除数据,我们必须小心使用sample
(我们不会交换“列”两个 - by-two再一次,但是以不同的顺序选择所有这些)
x.rand <- sample(dim(a)[1])
y.rand <- sample(dim(a)[2])
z.rand <- sample(dim(a)[3])
a[] <- a[x.rand, y.rand, z.rand, ]
假设一个维度较大的数组,可采用更具编程性的方法:
idx <- lapply(dim(a), sample) # shuffle dimensions
idx[[4]] <- TRUE # the only fixed dimension
a[] <- do.call(`[`, c(list(a), idx))