Skip to content

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]])
Dabei entspricht das Argument size der Größe des zu generierenden arrays, also dem, was man in array.shape erwarten würde.