R:选定尺寸的随机数组元素

时间:2014-11-28 11:40:14

标签: r multidimensional-array shuffle

问题:给定一个多维数组,将其元素在某些选定的维度中洗牌。理想情况下,数组应该 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;
    }
  }
}

但对于较大的阵列,我遇到了性能问题。

1 个答案:

答案 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))