Verwenden von R auf einem Windows-Rechner, ich bin zur Zeit eine geschachtelte Schleife auf einem 3D-Array läuft (720x360x1368), die zyklisch durch d1 und d2 Funktion über d3 anzuwenden und montieren die Ausgabe in ein neues Array ähnlicher Dimensionalität.parallelisieren verschachtelte Für-Schleife auf 3-dimensionales Array in R
Im folgenden reproduzierbaren Beispiel habe ich die Dimensionen 10, um den Faktor reduziert schneller machen Ausführung.
library(SPEI)
old.array = array(abs(rnorm(50)), dim=c(72,36,136))
new.array = array(dim=c(72,36,136))
for (i in 1:72) {
for (j in 1:36) {
new.listoflists <- spi(ts(old.array[i,j,], freq=12, start=c(1901,1)), 1, na.rm = T)
new.array[i,j,] = new.listoflists$fitted
}
}
wo spi() ist eine Funktion aus dem SPEI Paket eine Liste von Listen der Rückkehr, von denen eine bestimmten Liste $fitted
der Länge 1368 von jedem Schleifenschritt verwendet wird, um das neue Array cunstruct.
Während diese Schleife einwandfrei funktioniert, dauert es eine ziemlich lange Zeit zu berechnen. Ich habe gelesen, dass foreach
verwendet werden kann, um for
Schleifen zu parallelisieren.
Aber ich verstehe nicht, wie die Verschachtelung und die Montage des neuen Arrays können so erreicht werden, dass die dimnames der alten und der neuen Array konsistent sind.
(Am Ende, was ich will in der Lage sein, sowohl die alten und das neue Array in einen „flachen“ langen Panel-Datenrahmen mit as.data.frame.table()
und kombinieren sie entlang ihrer drei Dimensionen zu transformieren.)
Jede Hilfe, wie ich die gewünschte Ausgabe mit Hilfe von Parallelverarbeitung erreichen kann, wird sehr geschätzt!
Prost
CubicTom
Ich kann nicht wirklich sagen, was Sie (tun wollen [reproduzierbares Beispiel!] (Http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible- Beispiel)) aber haben Sie sich mit 'apply()' beschäftigt, das über n-dimensionale Arrays verallgemeinerbar ist? Das zweite Argument von apply() definiert die Dimensionen zum Anwenden einer Funktion über z.B.'apply (old.array, 1: 2, FUN = Funktion (x) paste0 (x))', um die Funktion 'paste0()' auf die dritte Dimension Ihres Arrays als Beispiel anzuwenden. –
Danke Simon, ich habe deinen Rat befolgt und mein Beispiel reproduzierbar gemacht. – CubicTom
Ich versuchte auch mit anwenden: 'new2.array <- apply (old.array, 1: 2, FUN = Funktion (x) spi (ts (x, freq = 12, Start = c (1901,1)), 1 , na.rm = T)) ', was sehr schnell ist, aber mir nur eine Matrix mit 72 * 36 = 2592 Elementen gibt, von denen jedes eine Liste von 8 ist. Ich bin nur am zweiten von diesen 8 interessiert ($ angepasst), was eine Liste der gewünschten Funktionswerte ist, die jedem Eintrag entlang d3 entsprechen. – CubicTom