【问题标题】:What is the most efficient way to write each element of a 3D array consecutively to file?将 3D 数组的每个元素连续写入文件的最有效方法是什么?
【发布时间】:2013-08-02 05:17:50
【问题描述】:

我有一个大型 3D 数组,我想将它作为单列写入文件。数据需要先按 Z(从高到低)变化,然后按 x(从低到高)变化,然后按 y(从低到高)变化。目前我正在这样做:

arr <<- array(0,dim=c(x,y,z)) # values aren't really 0
dataf <- data.frame(Px=rep(0,x*y*z))
ticker <- 0
  for (j in 1:y){
    for (i in 1:x){
      for (k in z:1){
        ticker <- ticker +1
        dataf[ticker,1] <- arr[i,j,k]
        }
      }
    }
write.table(dataf,file=filename,row.names=F,col.names=F)

这个过程很慢,似乎随着迭代的进行而变慢(通过进度条看到)。 我确定有一种使用 adply 的方法,但我无法让它工作。我像这样切换了 z 数据的顺序:

    for (n in 1:z)
      arr_inv[,,n] <- arr[,,(z-n+1)]

然后试着这样写:

write.table(adply(arr,.margins=c(1,2,3))[4],file=filename,row.names=F,col.names=F)

我所做的一切似乎都不是很快,所以我想知道你是否知道我应该如何处理这个问题? 谢谢

【问题讨论】:

  • 只需 melt 它使用 reshape2 然后像往常一样使用 write.table 导出生成的 data.frame
  • 您的 ticker 计数不应该从 1 开始,而不是 0 吗?
  • 谢谢,这是另一种方式,但仍然很慢。写一个 50kb 的文件大约需要 20 秒...
  • Hong,是的,我在这个例子中把它放在了错误的行,现在修复。谢谢

标签: arrays r output


【解决方案1】:

一种(复杂的)方法是使用lapply 将第三维数组拆分为列表元素,然后使用mapply 重塑矩阵,最后将其转换为输出向量:

mat <- array( rep(1:9,each=3) , dim = c(3,3,3) )
mat
, , 1

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
[3,]    1    2    3

, , 2

     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    4    5    6
[3,]    4    5    6

, , 3

     [,1] [,2] [,3]
[1,]    7    8    9
[2,]    7    8    9
[3,]    7    8    9


as.vector( t( mapply( c , lapply( 1:3 , function(x) as.vector( t(mat[,,x]) ) ) ) ) )
[1] 1 4 7 2 5 8 3 6 9 1 4 7 2 5 8 3 6 9 1 4 7 2 5 8 3 6 9

顺便说一句,请在下次提供可重现的示例

【讨论】:

  • 谢谢西蒙,这比我正在做的要好。
  • @Mark 很高兴它有帮助:-)
猜你喜欢
  • 2014-01-26
  • 2011-07-02
  • 2013-10-21
  • 2012-10-09
  • 2020-06-05
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多