NumPy

Attribute

array.ndim    # => Anzahl der Dimensionen
array.shape   # => Anzahl der Elemente je Dimension
array.size    # => Anzahl der Elemente
array.dtype   # => Datentyp (float, int, etc)

Array erstellen

np.array(<iterable>, <dtype>)             # => Umwandlung list => ndarray
  # Structured arrays mit Angabe von dtype je Element möglich => besser in Pandas
np.zeros(<shape>, <dtype>)               # => mit "0"er vorbelegen
  # Shape = (<Zeilen>, <Spalten>)
np.ones(<shape>, <dtype>)                # => mit "1"er vorbelegen
np.full(<shape>, fill_value=<Zahl>)  # => ganzes Array mit <Zahl> vorbelegen
np.arange(<start>, <stop>, <step>)  # => <stop> ist nicht enthalten!
np.linspace(<start>, <stop>, <num>) # => <stop> ist enthalten, <num> Zahlen gleichmäßig verteilt
np.eye(<N>)     # => quadratische NxN-Matrix mit "1" auf der Hauptdiagonalen und sonst "0" = Einheitsmatrix
np.diag(<list>) # => ähnlich wie eye, Liste wird auf Hauptdiagonale verteilt

Indizierung

array[<Zeile>][<Spalte>] (Python)                      # => array[<Zeile, Spalte>] (NumPy)
array[1:3]                                             # => Zeile 1-2 (3 nicht mehr enthalten)
array[0:2, 0]                                          # => Spalte 0 von Zeile 0+1 (2 nicht enthalten)
array[<liste>] = array[<liste>, :] = array[[1,2,4], :] # => liefert Zeilen 1 & 2 & 4
# Slicing erzeugt eine View => auch Daten im Original können verändert werden (keine Kopie!)
array[<slicing>].copy()                                # => erstellt echte Kopie der Daten

Reshaping

np.reshape(<array>, <newshape>) # => Daten auf neue Form verteilen, kann auch Anzahl der Dimensionen ändern
array[np.newaxis, :]            # => fügt dem Array eine weitere Dimension hinzu
array.ravel()                   # => erzeugt aus allen Elementen des Arrays ein ein-dimensionales Array als View
array.flatten()                 # => erzeugt aus allen Elementen des Arrays ein ein-dimensionales Array als Kopie
array.reshape((<a>, -1, <b>))   # => "-1" = automatic reshaping, berechnet fehlende Dimension selbständig

Datentyp ändern

np.<datatype>(<list>)        # => <datatype> = [(u)int8/16/32/64, float32/64, complex64/128)
np.array(<list>, dtype=<datatype>)
x = array.astype(<datatype>) # => bestehendes Array konvertieren

Arrays zusammenfügen

np.concatenate([x,y], axis=0)    #=> aneinander hängen: axis = 0 "untereinander", axis = 1 "nebeneinander"
np.vstack([<array1>, <array2>])  # => "vertikal" = "untereinander"
np.hstack([<array1>, <array2>])  # => "horizontal" = "nebeneinander"

ufuncs

Aggregations

np.max(<array>, axis=0) = array.max(axis=0) # => Achse <axis> wird reduziert ("gelöscht")

np.max(x)                                   # => Maximum über alle Elemente
np.max(x, axis=0)                           # => Maximum spaltenweise
np.max(x, axis=1)                           # => Maximum zeilenweise

Broadcasting ("Erweiterung")

x_mean = np.mean(x, axis=0)                # => Mittelwert pro Spalte
x_centered = x - x_mean                    # => elementweise Differenz
x_var = np.var(x, axis=0)                  # => Varianz pro Spalte
x_std = x_centered / np.sqrt(1e-6 + x_var) # => Z-normierte Werte
np.equal(new_mean, 0.0)   # => prüft ob new_mean genau gleich 0 ist
np.isclose(new_mean, 0.0) # => prüft ob new_mean etwa 0 Null (Abweichung =?)

Array Masks

np.count_nonzero(<array> > <const>) # => zählt, wie oft die Bedingung erfüllt wurde
np.all(<array> > <const>)           # => prüft, ob alle Elemente die Bedingung erfüllen
np.any(<array> > <const>)           # => prüft, ob mind. 1 Element die Bedingung erfüllt
x[x < 1.0]                          # => alle Elemente, die die Bedingung erfüllen. Shape => einfache Liste (1,)

Masked array = numpy.ndarray + (boolean) mask

masked_data = ma.masked_array(data, mask=[0, 0, 0, 1, 0])

Zufallszahlen

np.random.randint(<low>, <high>, <size>) # => zufällige, gleich-verteilete Int-Zufallszahlen zwischen 
                                         # "low" und "high" ("high" ist nicht enthalten!)
np.random.random(<size>)                 # => zufällige, gleich-verteilete Float-Zufallszahlen

Zufallszahlen, Random

np.random.randint(low=0, high=5, size=<shape>) # => integer, gleichverteilt (Bsp. 0 bis 4, 5 nicht enthalten)
np.random.random                               # => float, gleichverteilt
np.random.randn                                # => float, normalverteilt, feste Parameter: µ = 0, std = 1
np.random.choice                               # => Wählt zufälliges Element aus Liste
np.random.shuffle(<list>)                      # => Reihenfolge einer Liste ändern ("mischen"), in-place
np.random.permutation(<list>)                  # => Reihenfolge einer Liste ändern ("mischen"), Kopie
np.random.normal                               # => Normalverteilung, Parameter einstellbar
np.random.uniform(low=0, high=5, size=<shape>) # => Gleichverteilung, Parameter einstellbar

Multivariate => mehrdimensionale Normalverteilung

Achsen verschieben

np.moveaxis(<array>, source=0, destination=2) # => tauscht zwei beliebige Achsen
np.transpose(<array>)                         # => transponierte eines Arrays (gesamte Achsenliste wird "umgedreht")
<array>.T                                     # => transpose
np.roll(<array>, axis=0, shift=-1)            # => Zeilen (axis=0) bzw. Spalten (axis=1) nach oben/links (shift=-1)
                                              # bzw. unten/rechts(shift=+1) verschieben

Indices

np.indices(<shape>)   # => Array mit N+1 Dimensionen, das die Position aller Felder wiedergibt
np.diag_indices(N)    # => Indices der Hauptdiagonales einer Matrix NxX
np.tril_indices(N)    # => "lower": Indices der Hauptdiagonales und des unteren Dreiecks
np.triu_indices(N)    # => "upper": Indices der Hauptdiagonales und des oberen Dreiecks
np.where(x >= 2)      # => Indices der Elemente, die die Bedingung erfüllen

Sortieren

np.sort(<array>)     # => sortiert Elemente (zeilenweise), sonst: axis=0 (spaltenweise)
np.argsort(<array>)  # => gibt die Indices (=Liste der Position im <array>) einer sortierten Liste zurück
np.argmax(<array>)   # => Index des größten Elements im <array>
np.argmin(<array>)   # => Index des kleinsten Elements im <array>

I/O

np.save(<file>, <array>)  # => Daten (ein oder mehrere Array/s) binär speichern (*.npy)
data = np.load(<file>)    # => binäre Daten laden
np.savez                  # => mehrere Arrays in einer Datei speichern (*.npz)
np.savetxt                # => Array im ASCII-Format speichern => nur Zahlenwerte, Zuordnung zu mehreren nicht möglich (?)
np.loadtxt                # => Array im ASCII-Format laden