3D Array restrukturieren

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

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.

Code: Alles auswählen

import numpy as np
Vradial=matlabdatei['U']
[...]
laenge=86x83
nt=72
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: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Code: Alles auswählen

print( Vradial.shape) # Ausgabe (56, 83, 72)
Vradial.shape = (56*83, 72)
#oder
Vradial.shape = (-1, 72)
# -1: Numpy soll die geeignete Zahl finden
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

MagBen hat geschrieben:

Code: Alles auswählen

print( Vradial.shape) # Ausgabe (56, 83, 72)
Vradial.shape = (56*83, 72)
#oder
Vradial.shape = (-1, 72)
# -1: Numpy soll die geeignete Zahl finden
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.

Code: Alles auswählen

print( Vradial.shape)
(56, 83, 72)

Vrad_Snapshotbasis  = np.reshape(Vradial, (-1,nt))  

print( Vrad_Snapshotbasis.shape)
(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:

Code: Alles auswählen

# nt ist die Größe/Länge der 3.Dimension des Arrays Vtangential, wurde zuvor über shape abgefragt

#V_SB soll alle Spalten in einer großen Spalte untereinander enthalten, dafür initialisiert
v_SB = np.zeros(Vtangential.shape[0]*Vtangential.shape[1])

for i in range(nt):
    Vtang = np.concatenate(Vtangential[:,:,i], axis=0) # Vtang ist ein einzelner Snapshot, in einer Spalte stehe alle Geschw. Komponenten
    #V_tangSB = np.append(VtangSB, Vtang, axis=1)
    v_SB = np.column_stack((v_SB, Vtang)) # mit jedem Schleifendurchlauf wird eine weitere große Spalte rechts drangepappt
   
 print('Snapshotschleife:',i)

    Dims = v_SB.shape
    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: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

An einem kleinen Array kannst du den Mechanismus leichter durch Probieren verstehen lernen:

Code: Alles auswählen

import numpy as np

a = np.arange(24)
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

a.shape=(3,4,2)
print(a)
#[[[ 0  1]
#  [ 2  3]
#  [ 4  5]
#  [ 6  7]]
#
# [[ 8  9]
#  [10 11]
#  [12 13]
#  [14 15]]
#
# [[16 17]
#  [18 19]
#  [20 21]
#  [22 23]]]

print(a[1,2])
# [12 13]

a.shape = (-1,2)
print(a.shape)
# (12, 2)

print(a)
#[[ 0  1]
# [ 2  3]
# [ 4  5]
# [ 6  7]
# [ 8  9]
# [10 11]
# [12 13]
# [14 15]
# [16 17]
# [18 19]
# [20 21]
# [22 23]]

print( a[6])
# [12 13]
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten