【问题标题】:R: Shuffle array elements of selected dimensionsR:随机播放选定维度的数组元素
【发布时间】: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


【解决方案1】:

我认为 Pop 在删除答案之前的想法是正确的,但是如果您不想删除数据,则必须小心使用 sample(我们不会将“列”两两交换-两个,但以不同的顺序选择所有一次)

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

【讨论】:

  • 效果很好,非常感谢!第二种解决方案甚至适用于大型阵列。为什么第一个代码会创建 a 的副本,而第二个代码不会? a[indices]`[`(a,indices)do.call(`[`,indices)有什么区别?
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
相关资源
最近更新 更多