Array-Generatoren
Natürlich kann man wie zuvor zunächst eine Liste erstellen und diese dann in ein array umwandeln. Das ist aber einerseits wenig effizient und andererseits nicht besonders komfortabel. Hier lernen wir die gebräuchlichsten Methoden kennen, um arrays bestimmter Eigenschaften zu generieren.
Sequenzen
Wir haben bereits die eingebaute Funktion range
kennengelernt, die eine Sequenz von Zahlen generiert. In numpy
gibt es dafür arange
(array range), linspace
(linearly spaced), und logspace
(logarithmically spaced), die jeweils eine Sequenz von Zahlen generieren.
np.arange(4) # array([0, 1, 2, 3])
np.arange(0, 4, 1) # array([0, 1, 2, 3])
Die Argumente von arange
sind genauso wie bei range()
. Anders als dort sind jedoch Dezimalzahlen als Argumente möglich. Wird eine Ganzzahl übergeben, sind die array-Elemente auch Ganzzahlen. Wird eine Dezimalzahl übergeben, sind die array-Elemente auch Dezimalzahlen.
np.arange(0, 4, 1) # array([0, 1, 2, 3])
np.arange(0, 4, 1.) # array([0., 1., 2., 3.])
Während arange
eine Sequenz auf Basis der Schrittweite erzeugt, generiert linspace
ein array auf Basis der Anzahl der Schritte. Bei linspace
haben die Einträge einen konstanten Abstand zueiander. Bei logspace
werden die Einträge logarithmisch verteilt.
np.linspace(0, 4, 5) # array([0., 1., 2., 3., 4.])
np.logspace(0, 1, 3) # array([1., 3.16227766, 10.])
Strukturierte Arrays
In Gleichungen tauchen oft Matrizen auf, die eine bestimmte Struktur haben. Die Identitätsmatrix z.B. lässt sich wie folgt erstellen:
np.identity(3) # array([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
Dabei ist das einzige Argument die Größe der Matrix. Die Null-Matrix erhalten wir mit
np.zeros((3, 3)) # array([[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]])
Ist die Diagonale bekannt, so kann man auch die Diagonalmatrix erstellen:
np.diag([1, 2, 3]) # array([[1, 0, 0],
# [0, 2, 0],
# [0, 0, 3]])
Die gleiche Funktion gibt die Diagonale zurück, wenn die Matrix als Argument übergeben wird:
np.diag(np.identity(3)) # array([1., 1., 1.])
Zufallszahlen
An vielen Stellen erlauben (Pseudo-)Zufallszahlen eine elegante Lösung von Probleme. numpy.random
enthält eine Vielzahl von Funktionen, um Zufallszahlen zu generieren. Die Funktionen sind sortiert nach der Verteilung, aus derer sie gezogen werden.
np.random.uniform() # Eine Zahl zwischen 0 und 1
np.random.normal() # Eine Zahl aus einer Normalverteilung
Die Funktionen können auch ganze arrays mit Zufallszahlen erzeugen:
np.random.uniform(size=3) # array([0.01460819, 0.26540185, 0.39614082])
np.random.uniform(size=(2,3)) # array([[0.62304467, 0.30562049, 0.220623 ],
# [0.59263397, 0.55564913, 0.01394508]])
size
der Größe des zu generierenden arrays, also dem, was man in array.shape
erwarten würde.