2.12. NumPy Arrays#

In dieser Übung sollen die Unterschiede zwischen Listen und NumPy Arrays untersucht werden. Daraus ergibt sich das Verständnis in welchen Situation welches Datenkonstrukt sinnvoll eingesetzt werden kann. Darauf folgend soll das Zugreifen auf ein Array geübt werden. Im letzten Teil wird der Umgang mit Arrays weiter vertieft.

Aufgabenteil A - Verständnis, Operatoren#

  1. Erstellen Sie ein NumPy Array mit den Zahlen 0 - 9 nach folgenden Methoden:

    • konvertieren Sie eine Liste in ein Array

    • konvertieren Sie eine Range in ein Array

    • Nutzen Sie die arange Funktion vom NumPy-Modul und vergleichen Sie diese mit Range

  2. Vergleichen Sie folgende Operatoren zwischen Listen und Arrays und ermitteln Sie die Unterschiede:

    • addieren/subtrahieren Sie zwei Listen bzw. Arrays

    • addieren Sie eine Zahl

    • multiplizieren/dividieren Sie mit eine Zahl

  3. Beantworten Sie folgende Fragen und begründen Sie Ihre Antwort. Überprüfen Sie diese gegebenenfalls.

    • Ist es möglich die Liste [1, 2.3, True, "Hallo"] in ein Array zu konvertieren?

    • Ist es möglich zwischen Arrays unterschiedlicher Größe die Operatoren +, -, * und / anzuwenden?

    • Ist es möglich ein Array zu vergrößern?

Lösung#

Hide code cell content
import numpy as np

array = np.array([0,1,2,3,4,5,6,7,8,9])
print(array)
array = np.array(range(10))
print(array)
array = np.arange(10) # Hat die selben Parameter wie range(...)
print(array)
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
Hide code cell content
import numpy as np

print("Addition von Listen bzw. Arrays:")
print([0,1,2,3]+[0,1,2,3])
# print([0,1,2,3]-[0,1,2,3]) Bei Listen nicht möglich
print(np.arange(4)+np.arange(4))
print(np.arange(4)-np.arange(4))

print("Addition/Subtraktion mit einer Zahl")
# print([0,1,2,3]+1) Bei Listen nicht möglich
# print([0,1,2,3]-1) Bei Listen nicht möglich
print(np.arange(4)+1)
print(np.arange(4)-1)

print("Multiplikation/Division mit einer Zahl")
print([0,1,2,3]*2)
# print([0,1,2,3]/1) Bei Listen nicht möglich
print(np.arange(4)*2)
print(np.arange(4)/2)
Addition von Listen bzw. Arrays:
[0, 1, 2, 3, 0, 1, 2, 3]
[0 2 4 6]
[0 0 0 0]
Addition/Subtraktion mit einer Zahl
[1 2 3 4]
[-1  0  1  2]
Multiplikation/Division mit einer Zahl
[0, 1, 2, 3, 0, 1, 2, 3]
[0 2 4 6]
[0.  0.5 1.  1.5]
  • Bedingt, ein Array kann nur einen Typ haben, daher werden alle Elemente in str umgewandelt. Zusatz: Der genaue Typ kann mit dem parameter dtype festgelegt werden.

  • Nein, Arrays müssen für die angegeben Operatoren immer die gleiche Länge haben, da sonst nicht für jeden Index der Operator angewandt werden kann.

  • Nein, ein Array hat immer eine fixe Größe. Es ist jedoch möglich ein neues Array zu erstellen, mit dem hinzugefügten Element.

Aufgabenteil B - Verständnis, mehrdimensionale Arrays#

So wie Listen, können auch Arrays mehrdimensional sein. Solch ein Array kann wie folgt definiert werden.

array = np.array([
    [ 1, 2, 3, 4],
    [ 5, 6, 7, 8],
    [ 9,10,11,12],
    [13,14,15,16],
])
  1. Ermitteln Sie aus dem Array:

    • die Größe (size), also die gesamte Anzahl an Elementen,

    • die Form (shape), also wie viele Einträge pro Axe,

    • und die Dimension, also wie viele Axen vorhanden sind.

  2. Ähnlich wie bei Listen mit [index] für eine einzelne Stelle, [start:ende] für einen Teil und [:] für die gesamte Liste, kann auch ein Array modifiziert werden. Dabei wird durch ein , auf die nächste Axe zugegriffen.
    Greifen Sie auf das Array zu, sodass …

    • 1 zurückgegeben wird.

    • die 2. Reihe zurück gegeben wird.

    • die 3. Spalte zurück gegeben wird.

    • die 4 mittleren Werte zurückgegeben werden.

Lösung#

Hide code cell content
print("Größe:", array.size)
print("Form:", array.shape)
print("Dimension:", len(array.shape))
Größe: 16
Form: (4, 4)
Dimension: 2
Hide code cell content
print(array[0,0])
print(array[1])
print(array[:,2])
print(array[1:3,1:3])
1
[5 6 7 8]
[ 3  7 11 15]
[[ 6  7]
 [10 11]]

Aufgabenteil C - Laden von Daten aus Dateien#

Mit der Funktion loadtxt vom Modul NumPy ist es möglich Daten einfach aus einer Textdatei zu laden. Lesen Sie sich die Dokumentation zu der Funktion durch und laden Sie die Daten der Datei, die Sie hier downloaden können.

Die Datei enthält Daten bezüglich der gebauten Hochhäuser in Berlin, mit ihrer Gebäudehöhe, Vollgeschossanzahl und Baubeginn. Laden Sie die Daten und plotten Sie ..

  1. die Gebäudehöhe in Abhängigkeit vom Baubeginn.

  2. das Verhältnis aus Vollgeschosszahl und Gebäudehöhe in Abhängigkeit vom Baubeginn.

Lösung#

Hide code cell content
import numpy as np
import matplotlib.pyplot as plt

daten = np.loadtxt("hochhaeuser.csv", skiprows=1, delimiter=";")
hoehe = daten[:,0]
geschoss = daten[:,1]
jahr = daten[:,2]

plt.scatter(jahr, hoehe)
plt.title("Bauhöhe Hochhäuser Berlin")
plt.xlabel("Baubeginn")
plt.ylabel("Bauhöhe [m]")
plt.show()
../../../../_images/43664d77c20dce95f05fbc66f34839d02325d7f6eee9afbabe14eff100011294.png
Hide code cell content
plt.scatter(jahr, geschoss/hoehe)
plt.title("Geschosseffizienz Hochhäuser Berlin")
plt.xlabel("Baubeginn")
plt.ylabel("Geschosseffizienz [Geschoss/m]")
plt.show()
../../../../_images/4f7407e8eae6f9a3e59d4ca7ee9bd5005f5d7e19c6e6d1bc3eeb2ecb2eee7ebd.png