【发布时间】:2014-11-28 11:40:13
【问题描述】:
问题:给定一个多维数组,在一些选定的维度上打乱它的元素。理想情况下,数组应该在原位/就地打乱,因为第二个数组可能不适合我的记忆。
例如,给定一个具有 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;
}
}
}
但对于较大的阵列,我会遇到性能问题。
【问题讨论】:
-
我几乎可以肯定您的问题的答案是肯定的,但我需要更多解释一下您如何处理矢量
a -
添加了我自己的(坏的)方法。我希望这能阐明我想要做什么。
-
如果你有
n维度,你会一直想改组n-1维度吗?如果是,非洗牌维度是否总是最后一个? -
sample确实是一个更好的选择。但是,我不会删除我的任何数据,因为即使对于重复的索引,我也总是交换到条目,那么任何数据是如何丢失的呢? -
抱歉,我不得不再次调整我的问题:洗牌应该在原位进行,见第一段。我只是没有足够的 RAM 来存储第二个数组:-/
标签: r multidimensional-array shuffle