Arrayerstellung#
Einen NumPy Array können Sie sich am einfachsten wie ein Vektor oder eine Matrix vorstellen. Es zeichnet sich durch drei Kernkenngrößen aus: die Dimension, die Größe sowie die Einträge des Arrays.
Die Dimension eines Arrays entspricht der Anzahl der Indizes, die benötigt werden, um ein Element zu adressieren. Beispielsweise kann ein eindimensionales Array als ein Vektor und ein zweidimensionales als Matrix interpretiert werden.
Die Größe eines Arrays (engl. shape) wird durch ein Tupel \((n_1, n_2, \dots, n_{\mathrm{dim}})\) charakterisiert, wobei \(n_i\) die Anzahl der Einträge der \(i\)-ten Dimension (engl. axis) entspricht. Eindimensionale Arrays haben eine Länge von \(n\). Zweidimensionale Arrays besitzen die Größe \((m,n)\), wobei \(m\) die Anzahl der Zeilen und \(n\) die Anzahl der Spalten angibt.
Manuelle Arrayerstellung#
Sie können ein eindimensionales NumPy Array erstellen, in dem Sie dessen Einträge in einer Liste (gekennzeichent durch eckige Klammern \(\texttt{[]}\)) zusammenfassen und der Funktion \(\texttt{np.array}\) übergeben:
# Einbinden des Pakets numpy unter dem Alias 'np'
import numpy as np
x = np.array([0, 4]) # erstellt ein Array mit Einträgen 0 und 4
print(x)
Aufgabe 1.1
Erstellen Sie einen Vektor mit dem Namen \(\texttt{y}\) und den drei Elementen \(3\), \(7\) und \(9\).
# Ihr Code
Hinweis
Fassen Sie die Werte \(3\), \(7\) und \(9\) mittels eckiger Klammern \(\texttt{[]}\) zusammen und nutzen Sie die Funktion \(\texttt{np.array}\).
Lösung
y = np.array([3, 7, 9])
Auch wenn ein eindimensionales NumPy Array als Vektor interpretiert werden kann, ist es in Python weder ein Zeilen- noch ein Spaltenvektor. In dem Sinne sind eindimensionale Arrays Objekte, welche Zahlen in einer festen Reihenfolge speichern. Im folgenden werden wir sie dennoch Vektoren nennen.
Sie können eckige Klammern verschachteln und durch Kommata trennen, um ein zweidimensionales NumPy Array bzw. eine Matrix zu erstellen. Dabei geben Sie die Elemente Zeile für Zeile ein. Jede Zeile wird durch eckige Klammern abgegrenzt.
# erste Zeile von A: [1, 2, 3]
# zweite Zeile von A: [4, 5, 6]
A = np.array([[1, 2, 3], [4, 5, 6]])
print(A)
Aufgabe 1.2
Erstellen Sie eine \((2 \times 3)\) Matrix mit dem Namen \(\texttt{A_23}\) und den Werten
# Ihr Code
Lösung
A_23 = np.array([[4, 3, 2], [6, 7, 8]])
Aufgabe 1.3
Erstellen Sie eine \((4 \times 2)\) Matrix mit dem Namen \(\texttt{A_42}\) und den Werten
# Ihr Code
Lösung
A_42 = np.array([[-1, 0], [-7, 10], [2, 4.5], [3, -5]])
Aufgabe 1.4
Erstellen Sie eine \((1 \times 2)\) Matrix mit dem Namen \(\texttt{A_zeile}\) und den Werten
# Ihr Code
print(np.shape(A_zeile)) # sollte (1, 2) liefern
Hinweis
Um eine Matrix mit einer Zeile zu erstellen, nutzen Sie \(\texttt{np.array([[...]])}\). Der Aufruf \(\texttt{np.array([5, 10])}\) erstellt einen Vektor!
Lösung
A_zeile = np.array([[5, 10]])
Aufgabe 1.5
Erstellen Sie eine \((3 \times 1)\) Matrix mit dem Namen \(\texttt{A_spalte}\) und den Werten
# Ihr Code
print(np.shape(A_spalte)) # sollte (3, 1) liefern
Lösung
A_spalte = np.array([[3], [6], [-2]])
Innerhalb der eckigen Klammern können Sie auch Berechnungen durchführen.
x = np.array([np.abs(-3), 5**2])
print(x)
Aufgabe 1.6
Erstellen Sie einen Vektor mit dem Namen \(\texttt{y}\), welcher \(\sqrt{49}\) als erstes Element, \(\pi^2\) als zweites Element und \(\sin(4)\) als drittes Element enthält.
# Ihr Code
Lösung
y = np.array([np.sqrt(49), np.pi**2, np.sin(4)])
Vektoren mit Werten in gleichmäßigen Abständen#
In der Numerik – ebenso wie beim Programmieren – benötigen Sie häufig Vektoren, deren aufeinanderfolgende Einträge eine konstante Differenz aufweisen, wie beispielsweise beim Vektor \(\texttt{x}\).
x = np.array([3, 4, 5, 6, 7])
print(x)
Aufgabe 2.1
Definieren Sie einen Vektor mit dem Namen \(\texttt{y}\), der die Werte \(10\), \(11\) und \(12\) in genau dieser Reihenfolge enthält.
# Ihr Code
Hinweis
Nutzen Sie den Befehl \(\texttt{np.array}\) und fassen Sie die Elemente des Vektors in eckige Klammern zusammen.
Lösung
y = np.array([10, 11, 12])
Bei langen Vektoren ist das manuelle Eingeben der einzelnen Werte äußerst unpraktisch. Eine schnellere Alternative zum Erstellen von Vektoren mit gleichmäßigem Abstand zwischen den Werten bietet die Funktion \(\texttt{np.array}\) bei der lediglich der Start- und Endwert angegeben werden müssen: \(\texttt{np.arange(startwert, endwert)}\). Der Endwert ist allerdings nicht enthalten, das heißt \(\texttt{np.arange}\) erzeugt einen Wertebereich im Sinne des halboffenen Intervalls \([\texttt{startwert}, \texttt{endwert})\).
x = np.arange(3, 8)
print(x)
Aufgabe 2.2
Erstellen Sie mit dem Befehl \(\texttt{np.arange}\) einen Vektor mit den ganzzahligen Werten von \(10\) bis \(20\). Speichern Sie das Ergebnis in der Variable \(\texttt{x_range}\).
# Ihr Code
Hinweis
Denken Sie daran, dass \(\texttt{np.arange}\) den Endwert nicht mit einschließt.
Lösung
x_range = np.arange(10, 21)
Standardmäßig verwendet die Funktion \(\texttt{np.arange}\) einen Abstand von \(1\) zwischen zwei aufeinanderfolgenden Einträgen. Es ist aber auch möglich einen anderen Abstand festzulegen. Übergibt man der Funktion \(\texttt{np.arange}\) ein drittes Argument dann lassen sich auch Vektoren mit beliebigen Abständen erzeugen: \(\texttt{np.arange(startwert, endwert, abstand)}\). Zum Beispiel liefert der folgende Code ein Vektor mit Abstand \(3\).
x = np.arange(1, 13, 3)
print(x)
Aufgabe 2.3
Erstellen Sie einen Vektor \(\texttt{y_range}\), dessen Elemente bei \(-2\) beginnen, bei \(3\) enden und jeweils durch einen Abstand von \(0.5\) getrennt sind.
# Ihr Code
Lösung
y_range = np.arange(-2, 3.5, 0.5)
Aufgabe 2.4
Erstellen Sie einen Vektor \(\text{z_range}\), dessen Elemente bei \(0\) beginnen, bei \(30\) enden und jeweils durch einen Abstand von \(2\) getrennt sind.
# Ihr Code
Lösung
z_range = np.arange(0, 31, 2)
Anstatt den Abstand zwischen den einzelnen Elementen eines Vektors vorzugeben, können Sie auch die gewünschte Anzahl an Elementen zwischen einem Start- und einem Endwert angeben. Dazu wird die Funktion \(\texttt{np.linspace}\) verwendet. Sie erwartet die Eingabe in der Form \(\texttt{linspace(startwert, endwert, anzahl_elemente)}\). Wie auch bei der Funktion \(\texttt{np.arange}\) haben die Elemente alle denselben Abstand, welcher automatisch aus dem Start- und Endwert sowie der Elementanzahl bestimmt wird. Im Gegensatz zu der Funktion \(\texttt{np.arange}\) ist der Endwert bei \(\texttt{np.linspace}\) im Wertebereich des Vektors enthalten. Die Funktion erzeugt also einen Wertebereich im Sinne des abgeschlossenen Intervalls \([\texttt{startwert}, \texttt{endwert}]\), dabei haben die Einträge alle denselben Abstand zueinander.
x = np.linspace(0, 1, 5)
print(x)
Aufgabe 2.5
Erstellen Sie einen Zeilenvektor mit dem Namen \(\text{y_linspace}\), der bei \(1\) beginnt, bei \(12\) endet und der \(4\) Elemente enthält.
# Ihr Code
Lösung
y_linspace = np.linspace(1, 12, 4)
Zusatzaufgabe
Wenn Sie einen Vektor mit Werten im gleichen Abstand von \(1\) bis \(2\pi\) mit \(100\) Elementen erstellen wollten, würden Sie dann \(\texttt{np.arange}\) oder \(\texttt{np.linspace}\) verwenden?
Arrayerstellung mittels Funktionen#
Neben Funktionen zur Erzeugung gleichmäßig verteilter Vektoren bietet Python auch Möglichkeiten, Arrays mit zufälligen Einträgen zu erstellen. So erzeugt \(\texttt{np.random.rand(n)}\) einen Vektor mit \(n\) zufällig gleichverteilten gewählten Werten zwischen \(0\) und \(1\).
x = np.random.rand(2) # erstellt ein Vektor der Länge 2
print(x)
Aufgabe 3.1
Erstellen Sie einen Vektor der Länge \(7\) mit zufälligen Werten zwischen \(0\) und \(1\) und speichern Sie den Vektor in der Variablen \(\text{y_rand}\) ab.
# Ihr Code
Hinweis
Verwenden Sie die Funktion \(\texttt{np.random.rand(n)}\) und verwenden Sie \(7\) als Argument.
Lösung
y_rand = np.random.rand(7)
Die Funktion \(\texttt{np.random.rand}\) erlaubt auch mehrere Eingaben, um zum Beispiel Matrizen zu erzeugen. Die Eingabe \(\texttt{np.random.rand(m,n)}\) erstellt eine \((m \times n)\) Matrix mit zufälligen Einträgen.
A = np.random.rand(3, 2) # erstellt eine 3 x 2 Matrix
print(A)
Aufgabe 3.2
Erstellen Sie eine \((4 \times 4)\) Matrix mit zufälligen Einträgen zwischen \(0\) und \(1\) und speichern Sie die Matrix in der Variablen \(\text{A_rand}\) ab.
# Ihr Code
Lösung
A_rand = np.random.rand(4, 4)
Es gibt noch weitere Funktionen, um Arrays einer bestimmten Dimension und Größe zu erzeugen. Beispielsweise erzeugen die Funktionen \(\texttt{np.zeros}\) und \(\texttt{np.ones}\) Arrays, die ausschließlich aus Nullen bzw. Einsen bestehen. Die Erstellung von Vektoren funktioniert hierbei analog wie bei der Funktion \(\texttt{np.random.rand}\).
x = np.ones(7)
print(x)
Aufgabe 3.3
Erzeugen Sie mit Hilfe der Funktion \(\texttt{np.zeros}\) einen Vektor \(\text{x_zero}\) der Länge \(4\) und ausschließlich Null-Einträgen.
# Ihr Code
Lösung
x_zero = np.zeros(4)
Das Erzeugen von \((m \times n)\) Matrizen mittels \(\texttt{np.ones}\) oder \(\texttt{np.zeros}\) unterscheidet sich jedoch leicht zu der Funktion \(\texttt{np.random.rand}\).
In diesem Fall muss man die Anzahl der Zeilen \(m\) und die Anzahl der Spalten \(n\) in einem Tupel \((m, n)\) oder einer Liste \([m, n]\) zusammenfassen und als Eingabe verwenden. Beides liefert jedoch dasselbe Ergebnis:
A_rund = np.ones((4, 2)) # runde Klammern um 4, 2
print("A_rund =", A_rund)
A_eckig = np.ones([4, 2]) # eckige Klammern um 4, 2
print("A_eckig =", A_eckig)
Aufgabe 3.4
Erzeugen Sie mit Hilfe der Funktion \(\texttt{np.zeros}\) eine \((4 \times 7)\) Matrix aus Nullen und speichern Sie das Ergebnis in einer Variablen \(\text{A_zero}\).
# Ihr Code
Lösung
A_zero = np.zeros((4, 7))
# alternativ
A_zero = np.zeros([4, 7])
Das erzeugen von Nullvektoren oder -matrizen erlaubt es uns die Struktur eines Vektors oder einer Matrix bereits festzulegen und anschließend die Einträge Stück für Stück zu modifizieren, zum Beispiel, wenn Sie einen Einheitsvektor erstellen wollen.
Sie können die Größe, die Dimension und die Anzahl der Elemente eines bereits erstellten Array mit Hilfe der folgenden Funktionen auslesen:
\(\texttt{shape}\): Größe des Arrays
\(\texttt{ndim}\): Dimension des Arrays
\(\texttt{size}\): Anzahl der gesamten Elemente des Arrays
A = np.random.rand(3, 5)
print(np.shape(A))
print(np.ndim(A))
print(np.size(A))
Mit nur einer Codezeile können Sie so ein Array erstellen, das genauso groß ist wie die bereits vorhandene Matrix.
B_same_shape_as_A = np.ones(np.shape(A))
print(B_same_shape_as_A)