3D Array restrukturieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Chris987
User
Beiträge: 2
Registriert: Mittwoch 14. März 2018, 09:40

3D Array restrukturieren

Beitragvon Chris987 » Mittwoch 14. März 2018, 11:16

Hallo zusammen,

ich bin neu hier und möchte mich mit "big data" beschäftigen. Ich fange klein an mit Daten, die mir aus Matlab zur Verfügung gestellt werden.
Meine Frage ist folgende:
Es existiert ein 3D-Array mit den Dimensionen 56x83x72. Die ersten beiden Dimensionen mit 56x83 bilden eine 2D Ebene ab, die eine Geschwindigkeitskomponente enthält. Die dritte Dimension stellt die Zeit dar, also aufeinander folgende Zeitschritte (72 Stück). Für eine später folgende Analyse müssen die Daten eine andere Form gebracht werden: Eine "große "2D-matrix", jeder einzelne "Zeitschritt"soll in eine Spalte gewandelt werden.
Als Ergebnis möchte ich also eine Matrix( 4686 Zeilen * 72 Spalten). Meine bisherigen Versuche mit Numpy.reshape sind leider gescheitert.

  1. import numpy as np
  2. Vradial=matlabdatei['U']
  3. [...]
  4. laenge=86x83
  5. nt=72
  6. Vrad_Snapshotbasis  = np.reshape(Vradial, (laenge,nt))


Im Kern sollen also alle Spalten (83 an der Zahl) in eine Spalte úntereinander stehen, in der nächsten Spalte würde dann die nächsten 4686 Einträge stehen.
Hat jemand eine Idee, wie man das elegant mit Reshape machen kann?

Meine zweite Frage ist, wie man mit 'NaN' umgehen sollte. Die Matlab daten enthalten leider auch 'NaN'.

Beste Grüße
Christian
Benutzeravatar
MagBen
User
Beiträge: 750
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: 3D Array restrukturieren

Beitragvon MagBen » Mittwoch 14. März 2018, 11:29

  1. print( Vradial.shape) # Ausgabe (56, 83, 72)
  2. Vradial.shape = (56*83, 72)
  3. #oder
  4. Vradial.shape = (-1, 72)
  5. # -1: Numpy soll die geeignete Zahl finden
  6. print( Vradial.shape) # Ausgabe (4686, 72)
a fool with a tool is still a fool, www.magben.de, YouTube
Chris987
User
Beiträge: 2
Registriert: Mittwoch 14. März 2018, 09:40

Re: 3D Array restrukturieren

Beitragvon Chris987 » Mittwoch 14. März 2018, 14:30

MagBen hat geschrieben:
  1. print( Vradial.shape) # Ausgabe (56, 83, 72)
  2. Vradial.shape = (56*83, 72)
  3. #oder
  4. Vradial.shape = (-1, 72)
  5. # -1: Numpy soll die geeignete Zahl finden
  6. print( Vradial.shape) # Ausgabe (4686, 72)


Danke für die schnelle Antwort! so ganz verstehe ich aber leider nicht, auf was du hinaus möchtest. Die Länge der Spalte berechne ich mir zuvor über Size und multipliziere dann die ersten beiden Dimensionen miteinander.

  1. print( Vradial.shape)
  2. (56, 83, 72)
  3.  
  4. Vrad_Snapshotbasis  = np.reshape(Vradial, (-1,nt))  
  5.  
  6. print( Vrad_Snapshotbasis.shape)
  7. (4648, 72)


Wenn ich mir dann aber anschaue, ob auch die ursprüngliche zweite Spalte von Vradial in Vrad_snapshotbasis nach den ersten 56 Einträgen beginnt, stelle ich fest, das dem nicht so ist: Ich vergleiche mir beide Arrays und lasse mir in Spyder "Vradial" anzeigen (Axis=2, Slicing [:,:,0]), auch "Vrad-Snapshotbasis":
Die erste Zeile wird zur ersten Spalte, gewissermaßen nach unten um 90 Grad umgeklappt (transponiert?). Das möchte ich aber nicht, weil die zeitliche Dynamik, die in der Reihenfolge der Informationen steckt, damit verloren geht.

Folgendes hässliche Konstrukt habe ich versucht mir zu basteln, ich hoffe die Intention dahinter wird deutlich:

  1. # nt ist die Größe/Länge der 3.Dimension des Arrays Vtangential, wurde zuvor über shape abgefragt
  2.  
  3. #V_SB soll alle Spalten in einer großen Spalte untereinander enthalten, dafür initialisiert
  4. v_SB = np.zeros(Vtangential.shape[0]*Vtangential.shape[1])
  5.  
  6. for i in range(nt):
  7.     Vtang = np.concatenate(Vtangential[:,:,i], axis=0) # Vtang ist ein einzelner Snapshot, in einer Spalte stehe alle Geschw. Komponenten
  8.     #V_tangSB = np.append(VtangSB, Vtang, axis=1)
  9.     v_SB = np.column_stack((v_SB, Vtang)) # mit jedem Schleifendurchlauf wird eine weitere große Spalte rechts drangepappt
  10.    
  11.  print('Snapshotschleife:',i)
  12.  
  13.     Dims = v_SB.shape
  14.     print(Dims)


hat nur den Nachteil dass die erste Spalte noch aus lauter Nullen besteht. Hier enthält aber jede Spalte nur die Geschwindigkeiten spaltenweise.


Nachtrag: Durch die Vertauschung von Zeilen und Spalten geht geht innerhalb eines Zeitschritts zwar nicht die Information verloren, aber die Reihenfolge der Koordinaten (56x83) geht durcheinander.
Benutzeravatar
MagBen
User
Beiträge: 750
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: 3D Array restrukturieren

Beitragvon MagBen » Mittwoch 14. März 2018, 15:50

An einem kleinen Array kannst du den Mechanismus leichter durch Probieren verstehen lernen:
  1. import numpy as np
  2.  
  3. a = np.arange(24)
  4. print(a)
  5. # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
  6.  
  7. a.shape=(3,4,2)
  8. print(a)
  9. #[[[ 0  1]
  10. #  [ 2  3]
  11. #  [ 4  5]
  12. #  [ 6  7]]
  13. #
  14. # [[ 8  9]
  15. #  [10 11]
  16. #  [12 13]
  17. #  [14 15]]
  18. #
  19. # [[16 17]
  20. #  [18 19]
  21. #  [20 21]
  22. #  [22 23]]]
  23.  
  24. print(a[1,2])
  25. # [12 13]
  26.  
  27. a.shape = (-1,2)
  28. print(a.shape)
  29. # (12, 2)
  30.  
  31. print(a)
  32. #[[ 0  1]
  33. # [ 2  3]
  34. # [ 4  5]
  35. # [ 6  7]
  36. # [ 8  9]
  37. # [10 11]
  38. # [12 13]
  39. # [14 15]
  40. # [16 17]
  41. # [18 19]
  42. # [20 21]
  43. # [22 23]]
  44.  
  45. print( a[6])
  46. # [12 13]
a fool with a tool is still a fool, www.magben.de, YouTube

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder