Wenden Sie eine Funktion auf jede Ebene eines 3D-Arrays an und geben Sie ein Array zurück

8

Stellen Sie sich vor, Sie haben ein 3-dimensionales Array mit Zeilen, Spalten und Layern:

%Vor%

und stellen Sie sich vor, Sie haben eine Funktion, die eine Matrix als Eingabe verwendet und eine Matrix als Ausgabe zurückgibt, wie t .

Wie können Sie die Funktion auf jede Ebene des Arrays anwenden, indem Sie ein anderes Array derselben Größe wie das erste zurückgeben?

Ich glaube, ich sollte es irgendwie mit apply machen können, aber ich kann nicht.

Bonusfrage (Ich wäre sehr dankbar, wenn Sie dies beantwortet hätten): Ist es schneller, oder machen Sie eine Liste der einzelnen Ebenenmatrizen und lapply der Funktion?

-

Edit: Bitte denken Sie nicht, dass diese Frage beantwortet wird - die Antwort beantwortet die Frage nicht.

    
Marius Kempe 10.12.2012, 23:32
quelle

2 Antworten

4

Sie müssen überlegen, über welche Ränder Sie die Werte extrahieren möchten.

Sie können jede der 3rd -Dimensionsmatrizen transponieren, indem Sie die Dimensionen 1 und 2 anwenden (Zeilen und Spalten ohne ein besseres Wort)

%Vor%

Sie können auch plyr und aaply verwenden, die möglicherweise intuitiver agieren

%Vor%

Was ist schneller lapply oder apply , würde ich vielleicht denken, dass lapply gewinnen würde, aber Sie müssten immer noch darüber nachdenken, aus welchen Margen Sie die Matrizen extrahieren wollten.

Ich finde es normalerweise viel einfacher, in einer Dimension zu denken. Alles wäre einfacher, wenn die Erde flach wäre!

    
mnel 10.12.2012 23:39
quelle
1

Eine andere Möglichkeit für die Transposition ist die Funktion aperm .

%Vor%

Was das Anwenden einer Funktion auf jede Ebene betrifft (sagen wir, Sie möchten jede Ebene mit einem anderen Wert multiplizieren), ist hier eine andere Möglichkeit:

%Vor%

Aber wie Sie sehen, erstellt es eine Liste, also benötigt es einen weiteren Schritt mit der Funktion simplify2array :

%Vor%

Oder direkt mit sapply :

%Vor%     
plannapus 12.12.2012 10:16
quelle

Tags und Links