簡體   English   中英

R - 在數組的每個元素上並行應用函數

[英]R - apply function on each element of array in parallel

我有最高和最低溫度和降水的測量值,這些測量值被組織為大小數組 (100x96x50769),其中 i 和 j 是具有關聯坐標的網格單元,z 表示隨時間變化的測量次數。

從概念上講,它看起來像這樣:

在此處輸入圖片說明

我正在使用climdex.pcic包來計算極端天氣事件的指數。 給定最高和最低溫度和降水的時間序列, climdexInput.raw函數將返回一個climdexIput對象,該對象可用於確定幾個指標:霜凍天數、夏季天數、連續干旱天數等。

該函數的調用非常簡單:

ci <- climdexInput.raw(tmax=x, tmin=y, prec=z,
                       t, t, t, base.range=c(1961,1990))

其中 x 是最高溫度向量,y 是最低溫度向量,z 是降水向量,t 是帶有測量 x、y 和 z 的日期的向量。

我想要做的是為我的數組的每個元素(即上圖中的每個網格單元)提取時間序列,並使用它來運行climdexInput.raw函數。

由於真實數據的大量元素,我想在我的 4 核 Linux 服務器上並行運行此任務。 但是,我沒有 R 中並行化的經驗。

這是我的程序的一個示例(有意減少尺寸以加快在計算機上的執行速度):

library(climdex.pcic)

# Create some dates
t <- seq(as.Date('2000-01-01'), as.Date('2010-12-31'), 'day')

# Parse the dates into PCICt
t <- as.PCICt(strftime(t), cal='gregorian')

# Create some dummy weather data, with dimensions `# of lat`, `# of lon` and `# of timesteps`
nc.min <- array(runif(10*9*4018, min=0, max=15), c(10, 9, 4018))
nc.max <- array(runif(10*9*4018, min=25, max=40), c(10, 9, 4018))
nc.prc <- array(runif(10*9*4018, min=0, max=25), c(10, 9, 4018))

# Create "ci" object
ci <- climdexInput.raw(tmax=nc.max[1,1,], tmin=nc.min[1,1,], prec=nc.prc[1,1,],
                       t, t, t, base.range=c(2000,2005))

# Once you have “ci”, you can compute any of the indices provided by the climdex.pcic package.
# The example below is for cumulative # of dry days per year:
cdd <- climdex.cdd(ci, spells.can.span.years = TRUE) 

現在,請注意,在上面的示例中,我僅使用數組 ([1,1,]) 的第一個元素作為climdexInput.raw函數中的示例。

如何利用並行處理對所有元素做同樣的事情,可能是通過循環數組的維度ij

您可以使用 foreach 來做到這一點:

library(doParallel)
registerDoParallel(cl <- makeCluster(3))
res <- foreach(j = seq_len(ncol(nc.min))) %:% 
  foreach(i = seq_len(nrow(nc.min))) %dopar% {
    ci <- climdex.pcic::climdexInput.raw(
      tmax=nc.max[i,j,], 
      tmin=nc.min[i,j,],
      prec=nc.prc[i,j,],
      t, t, t, 
      base.range=c(2000,2005)
    )
  }
stopCluster(cl)

請參閱我關於使用 foreach 的並行性指南: https : //privefl.github.io/blog/a-guide-to-parallelism-in-r/

然后,要計算索引,只需使用climdex.cdd(res[[1]][[1]], spells.can.span.years = TRUE) (首先是j ,其次是i )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM