Broadcast ein Array auf unterschiedliche Form (Hinzufügen "fake" Dimensionen)

In python (mit numpy) kann ich ein Array auf eine andere Form übertragen:

>>> import numpy as np >>> a = np.array([2,3,4]) >>> b = np.zeros((3,2)) >>> b[:,:] = np.zeros((3,2)) >>> b[:,:] = a[:,np.newaxis] #<-- np.newaxis allows `a` to be "broadcasted" to the same shape as b. >>> b array([[ 2., 2.], [ 3., 3.], [ 4., 4.]]) >>> c = np.zeros((2,3)) >>> c[:,:] = a[np.newaxis,:] >>> c array([[ 2., 3., 4.], [ 2., 3., 4.]]) 

Gibt es irgendeinen Weg, um die gleiche Wirkung in Fortran zu erreichen? Ich habe eine Unterroutine, die erwartet, dass ein 2D Array weitergegeben wird – ich möchte meine 1-D-Arrays bis zu 2-D "ausstrahlen", wie ich oben gezeigt habe. Wie es scheint, dass es wahrscheinlich ist wichtig, meine 2D-Array hat eine explizite Schnittstelle.

Als seitliche Anmerkung dachte ich, dass diese Funktionalität durch die reshape intrinsisch zur Verfügung gestellt werden könnte – Etwas wie:

 real,dimension(3) :: arr1d reshape(arr1d, (/3,3/), order=(/1,/1)) 

Aber nach dem Lesen der docs, denke ich nicht, dass dies möglich ist, da die order scheint, alle Zahlen 1 auf "N" aufzunehmen.

Bearbeiten: Um ein wenig klarer zu sein, suche ich nach einem einfachen Weg, um ein paar Transformationen an einem Input zu erzeugen, so dass:

Fall 1

 b(i,j) .eq. a(i) !for all j, or even just j=1,2 

und

Fall 2

 b(j,i) .eq. a(i) !for all j, or even just j=1,2 

Bonuspunkte 1 für willkürliche Dimensionalität:

 b(i,j,k) .eq. a(i,j) b(i,k,j) .eq. a(i,j) 

etc.

1 Haftungsausschluss – ich habe eigentlich keine Sofortmächte, um Bonuspunkte auf den Anrufbeantworter zu geben 😉

2 Solutions collect form web for “Broadcast ein Array auf unterschiedliche Form (Hinzufügen "fake" Dimensionen)”

Ich bin mir nicht sicher, was du versuchst zu erreichen, aber hier sind ein paar Fragmente, die helfen können.

reshape kann ein optionales Argument, genannt pad , die verwendet werden können, um die 'extra' Elemente benötigt, wenn Sie in ein Array mit mehr Elemente als Sie begonnen, sagen, von 3×4 bis 2x4x2.

Sie können sich auch für die Spreizfunktion interessieren, die für die "Aufstockung" von Arrays ausgelegt ist, die ein Rang-N-Array einnimmt und ein Rang-N + 1-Array ausgibt. Das Fragment in deiner zweiten Kopie konnte umgeschrieben werden

 array2d = spread(array1d,2,2) 

In diesem Beispiel ist das zweite Argument die Dimension, um die das erste Argument zu verbreiten, um die Ausgabe zu machen. Das dritte Argument ist die Anzahl der Kopien des Eingabe-Arrays zu machen.

PS Der Aufruf zu spread sollte vielleicht spread(array1d,1,2) , ich habe es nicht überprüft.

BEARBEITEN in Reaktion auf OP's Bearbeitung der Frage

Die beiden Fälle 1 und 2 werden durch die Ausbreitung über die Abmessungen 2 bzw. 1 erfüllt. In Fortran

 b = spread(a,2,j) 

und

 b = spread(a,1,j) 

Da die spread ein Array mit Rang 1 größer als der Rang seines ersten Arguments zurückgibt, bietet es die begehrte willkürliche Dimensionalität. Doch da es so platzaufwendig ist, Arrays von Rang-3 und darüber zu zeigen, gehe ich nicht.

Die reshape intrinsic ermöglicht es Ihnen, das 1D-Array in ein 2D-Array zu kopieren. Mit einem ausreichend neueren Fortran-Compiler ist es eine Zeigertechnik. Ein Zeiger bietet eine zweite Möglichkeit, sich auf die Speicherung zu beziehen und die Kopie zu vermeiden. Die Methode ist "Pointer bounds remapping". Ein Beispiel:

 program array_tst integer, dimension (4), target :: array_1d integer, dimension (:,:), pointer :: array_2d array_1d = [ 1, 2, 3, 4 ] array_2d (1:2, 1:2) => array_1d write (*, *) array_2d (1,1), array_2d (1,2), array_2d (2,1), array_2d (2,2) end program array_tst 

Siehe auch wechselnde Array Dimensionen in Fortran

PS In Antwort auf die Kommentare … Wenn es Ihnen nichts ausmacht, das Array zu kopieren, hier ist, wie man umformt:

 program array_reshape integer, dimension (4) :: array_1d integer, dimension (2, 2) :: array_2d array_1d = [ 1, 2, 3, 4 ] array_2d = reshape ( array_1d, [2,2] ) write (*, *) array_2d (1,1), array_2d (1,2), array_2d (2,1), array_2d (2,2) end program array_reshape 
  • Numpy shorthand für die zerkleinerte Scheibe
  • Numpy: Ersetzen Sie jeden Wert im Array mit dem Mittelwert seiner angrenzenden Elemente
  • Was ist hinter diesem numpy Auswahlverhalten los?
  • Erläuterung zu Numpy Broadcasting Antwort
  • Python ist die beste Programmiersprache der Welt.