【问题标题】:Read data into array slices in R将数据读入R中的数组切片
【发布时间】:2015-06-20 09:32:49
【问题描述】:

如何将大型 csv 文件读入 R 中的数组切片? 我有 500 个 480 行和 640 列的 csv 文件,其中包含热像仪的数据。我想做的是一个尺寸为 640 x 480 x 500 的阵列,实际上阵列的每个切片都包含一张由热像仪拍摄的照片(640 x 480 像素(以°C 为单位的值))。直到现在,我将 csv 文件放在带有 for 循环的矩阵列表中,然后将它们取消列出以创建一个数组。这样做的问题是我的计算机 RAM 很快就满了,所以一次将数据存储在一个数组中可能会更好,但我只是不知道该怎么做。无论如何,我需要数组格式的数据以进行进一步计算。

matrices<-list()

for (i in 0:endval){
        filenumber<-sprintf("%03d",(i+1))
        matrices[[i+1]]<-read.csv2(file=paste(nameoffile,filenumber,".csv",sep=""),header=F)
        }

array1<-array(unlist(matrices), dim = c(nrow(matrices[[1]]), ncol(matrices[[1]]), length(matrices)))

提前致谢!

【问题讨论】:

  • 格式化它的最佳方式可能更多地取决于您将如何使用它。在大多数情况下,我可能会选择将其存储为矩阵列表而不取消列出,但这又取决于。
  • 对于大多数应用程序,矩阵列表可以完成这项工作,但在某一时刻,我必须取平均值作为 st.dev。在 z 轴上,所以是所有 500 张图片的平均值。我找到了一种对数组执行此操作的方法,但不适用于矩阵列表。是否可以从数组中提取一个切片到矩阵?如果是这种情况,我宁愿将数据放在一个数组中。

标签: arrays r csv for-loop matrix


【解决方案1】:

您应该预先分配一次数组,然后在循环浏览 CSV 文件时填写每个 z-slice。根据我的测试,一个 640x480x500 的双精度数组似乎需要大约 1.2GB,而 500 个 CSV 读取每个直接分配给数组的 z 切片大约需要 3.5 分钟。因此,就 RAM 影响和计算时间而言,这是非常站得住脚的:

X <- 640; Y <- 480; N <- 500;
write.csv(matrix(1:(X*Y),X,Y),'pic1.csv',row.names=F); ## for testing
system.time({ x <- array(NA_real_,c(X,Y,N)); }); ## preallocate
##    user  system elapsed
##   1.640   0.109   1.743
object.size(x);
## 1228800208 bytes
e <- 2; Xv <- -((1+e):(X-e)); Yv <- -((1+e):(Y-e)); Nv <- -((1+e):(N-e));
x[Xv,Yv,Nv];
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]   NA   NA   NA   NA
## [2,]   NA   NA   NA   NA
## [3,]   NA   NA   NA   NA
## [4,]   NA   NA   NA   NA
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]   NA   NA   NA   NA
## [2,]   NA   NA   NA   NA
## [3,]   NA   NA   NA   NA
## [4,]   NA   NA   NA   NA
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]   NA   NA   NA   NA
## [2,]   NA   NA   NA   NA
## [3,]   NA   NA   NA   NA
## [4,]   NA   NA   NA   NA
## 
## , , 4
## 
##      [,1] [,2] [,3] [,4]
## [1,]   NA   NA   NA   NA
## [2,]   NA   NA   NA   NA
## [3,]   NA   NA   NA   NA
## [4,]   NA   NA   NA   NA
## 
system.time({ for (i in 1:N) { fileName <- 'pic1.csv'; x[,,i] <- as.matrix(read.csv(fileName)); }; });
##    user  system elapsed
## 207.000   0.969 208.492
object.size(x);
## 1228800208 bytes
x[Xv,Yv,Nv];
## , , 1
## 
##      [,1] [,2]   [,3]   [,4]
## [1,]    1  641 305921 306561
## [2,]    2  642 305922 306562
## [3,]  639 1279 306559 307199
## [4,]  640 1280 306560 307200
## 
## , , 2
## 
##      [,1] [,2]   [,3]   [,4]
## [1,]    1  641 305921 306561
## [2,]    2  642 305922 306562
## [3,]  639 1279 306559 307199
## [4,]  640 1280 306560 307200
## 
## , , 3
## 
##      [,1] [,2]   [,3]   [,4]
## [1,]    1  641 305921 306561
## [2,]    2  642 305922 306562
## [3,]  639 1279 306559 307199
## [4,]  640 1280 306560 307200
## 
## , , 4
## 
##      [,1] [,2]   [,3]   [,4]
## [1,]    1  641 305921 306561
## [2,]    2  642 305922 306562
## [3,]  639 1279 306559 307199
## [4,]  640 1280 306560 307200

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2021-04-02
    • 2013-07-24
    • 2012-11-10
    • 1970-01-01
    • 2018-08-26
    • 2021-09-04
    相关资源
    最近更新 更多