Übungsaufgaben zu Lektion 5

Vorab

Eine Anleitung für die Bearbeitung und Abgabe der Übunsgaufgaben in Python findet Ihr im Abgabebereich des Moodlekurses ( Link ).

Kurzform: Eine Aufgabe besteht immer aus einer "Funktion", die für einen definierten Input (Argumente) einen definierten Output zurückgeben soll (engl.: return). Überprüft die Korrektheit dieses Outputs und damit Eurer Lösung mit testme(funktionsname). Wenn Ihr fertig seid, erzeugt unter im Abschnitt Gesamtauswertung Euer Zertifikat und gebt es dann in Moodle zusammen mit diesem Notebook ab.

Hier ein Beispiel für eine Funktion: Die Funktion heißt beispiel, hat die Argumente (den Input) x und y und gibt die Variable ergebnis zurück. Das Ergebnis ist in diesem Fall die Summe der Argumente x und y.

In [ ]:
def beispiel(x, y):
    ergebnis = x + y
    return(ergebnis)
In [ ]:
beispiel(1,1)
In [ ]:
beispiel(2,-3)

Testzentrum importieren!

In [ ]:
from testzentrum import *

Weitere benötigte Pakete importieren

In [ ]:
import numpy as np

Die n-te Dimension

Kurze Aufwärmübung: Die Funktion dimensionen soll für den NumPy-Array x die Zahl der Dimensionen zurückgeben.

In [ ]:
def dimensionen(x):
    pass
In [ ]:
testme(dimensionen)

Hochwasser I

Das Array hq stelle für n Abflusspegel (Zeilen) und m Jahre (Spalten) den jährlichen Maximalabfluss ($HQ$) dar. Die Funktion wie_oft gebe die Gesamtzahl der Überschreitungen (>) eines Abflusses von x für alle Pegel und Jahre zurück.

Beispiel:

# 2 Pegel, 3 Jahre
>>> hq = np.array([[11,  1, 19],
                   [ 2, 13, 23]])
>>> x = 10
# Ergebnis: 4
In [ ]:
def wie_oft(hq, x):
    pass
In [ ]:
testme(wie_oft)

Hochwasser II

Die Ausgangslage sei die gleiche wie für die Aufgabe "Hochwasser I": Das Array hq stelle für n Abflusspegel (Zeilen) und m Jahre (Spalten) den jährlichen Maximalabfluss (HQ) dar.

Die Funktion mhq soll nun für jeden Pegel den mittleren HQ-Wert zurückgeben (MHQ) - und zwar als Liste, in der die MHQ-Werte auf eine Dezimalstelle gerundet sind. Für die Umwandlung in eine Liste könnt Ihr die Arraymethode .tolist() verwenden.

Beispiel:

# 2 Pegel, 3 Jahre
>>> hq = np.array([[11,  1, 19],
                   [ 2, 13, 23]])
# ergebnis = [10.3, 12.7]
In [ ]:
def mhq(hq):
    pass
In [ ]:
testme(mhq)

Hochwasser III

Die Ausgangslage sei die gleiche wie für die Aufgabe "Hochwasser I": Der Array hq stelle für n Abflusspegel (Zeilen) und m Jahre (Spalten) den jährlichen Maximalabfluss (HQ) dar.

Die Funktion n_pegel gebe die Zahl der Pegel zurück, an denen mehr als zweimal ein Abfluss von x überschritten wurde.

Beispiel:

# Generierung von Beispielargumenten
>>> x = 12
>>> hq = np.array([[11,   1, 19], # 1 x (hq > x)
                   [ 2,  13, 23], # 2 x (hq > x)
                  [ 20, 13, 23]]) # 3 x (hq > x)
# --> An nur EINEM Pegel wird der Abfluss von x=12 MEHR als 2 x überschritten
# Ergebnis: 1
In [ ]:
def n_pegel(hq, x):
    pass
In [ ]:
testme(n_pegel)

Datenaufnahme

Auf einer Versuchsfläche für Gemüseanbau wurde ein Grid mit m Zeilen und n Spalten angelegt. Beginnend bei der ersten Gitterzelle wurde in allen Gitterzellen zeilenweise der $N_{min}$-Gehalt beprobt. Leider wurden die Daten einfach nur hintereinandergeschrieben - als 1-D Array namens nmin. Stelle mit der Funktion nminventur zunächst die Daten als 2-D Array dar und gib dann den Mittelwert der Spalte mit dem Index j zurück. Runde dabei auf eine Nachkommastelle.

Beispiel:

# Beispielargumente
>>> nmin = np.array([1,2,3,4,5,6])
>>> m = 2
>>> n = 3
>>> j = 1
# Zwischenergebnis: Array in 2-D
array([[1, 2, 3],
       [4, 5, 6]])
# Ergebnis ist der Mittelwert aus 2 und 5
# (Spalte mit Index j=1, also 2. Spalte)
# Ergebnis: 3.5

Hinweis: Ihr benötigt die numpy-Funktionen reshape und mean sowie die Funktion round.

In [ ]:
def nminventur(nmin, m, n, j):
    pass
In [ ]:
testme(nminventur)

Niederschlagsmaximum

Das Argument precip sei ein 2-D Array ("Gitter") der Niederschlagshöhe. Die Funktion maxort soll die Indizes für Zeile und Spalte von precip zurückgeben, in denen die Niederschlagshöhe maximal ist.

Das ist nicht ganz trivial. Schaut Euch genau die Hilfe zur Funktion np.argmax an, um das Problem zu lösen.

Beispiel:

# Beispielargument
>>> precip = np.array([[11,  1, 0],
                       [ 2, 10, 1],
                       [ 1, 31, 1],
                       [ 0, 0,  0]])
# Der Maximalwert ist 31.
#    Er liegt in der 3. Zeile (Zeilenindex 2)
#    und der 2. Spalte (Spaltenindex 1)
# Ergebnis: (2,1)

Hinweis: Ihr benötigt die numpy-Funktionen unravel_index und argmax. Die Rückgabe der beiden Indizes soll als tuple erfolgen, das ist der Datentyp, den unravel_index in so einem Fall zurückgibt. Ein tuple ist sowas ähnliches wie eine Liste, aber im Gegensatz zu einer Liste "unveränderlich". Tuples haben runde Klammern: (2,1).

In [ ]:
def maxort(precip):
    pass
In [ ]:
testme(maxort)

Direktabflussvolumen

Das 3-D Array precip stelle die Niederschlagshöhe (in mm) für p aufeinanderfolgende Zeitschritte auf einem Gitter mit m Zeilen und n Spalten dar. Das 2-D Array psi stelle für alle Zeilen und Spalten (m x n) den mittleren Abflussbeiwert des Ereignisses dar (in Prozent). Die Fläche einer jeden Gitterzelle sei 1 km$^2$.

Die Funktion direktabflussvolumen soll nun das gesamte Direktabflussvolumen des Ereignisses in der Einheit $m^3$ zurückgeben. Runde dabei auf eine Nachkommastelle!

Beispiel:

# Beispielargumente
>>> precip = np.repeat([10,20,30],4).reshape((3,2,2))
>>> precip
array([[[10, 10],
        [10, 10]],

       [[20, 20],
        [20, 20]],

       [[30, 30],
        [30, 30]]])
>>> psi = np.array([[0, 10],[50, 100]]) # in Prozent!
>>> psi
array([[  0,  10],
       [ 50, 100]])
# Zwischenergebnis: Direktabfluss für jede Zelle und jeden Zeitschritt (Einheit mm)
array([[[ 0.,  1.],
        [ 5., 10.]],

       [[ 0.,  2.],
        [10., 20.]],

       [[ 0.,  3.],
        [15., 30.]]])
# Zwischenergebnis: gesamtes Direktabflussvolumen (in mm) --> 96 mm
# Ergebnis: das gesamte Direktabflussvolumen (in Kubikmeter)
# 96000 m³
In [ ]:
def direktabflussvolumen(precip, psi):
    pass
In [ ]:
testme(direktabflussvolumen)

Gebietsniederschlag

Wiederum stelle das 3-D Array precip die Niederschlagshöhe (in mm) für p aufeinanderfolgende Zeitschritte auf einem Gitter mit m Zeilen und n Spalten dar. Das 2-D Array ist_gebiet zeige für alle Elemente des Gebiets (mxn) an, ob sie zum Einzugsgebiet gehören.

Die Funktion gebietsniederschlag soll nun die mittlere Niederschlaghöhe im Einzugsgebiet für das gesamte Ereignis zurückgeben (Gebietsniederschlag in mm, gerundet auf eine Nachkommastelle).

Beispiel:

# Beispielargumente
>>> precip = np.repeat([10,20,30],4).reshape((3,2,2))
>>> precip[:,1,:] = 2
>>> precip[:,:,0] = 4
>>> precip
array([[[ 4, 10],
        [ 4,  2]],

       [[ 4, 20],
        [ 4,  2]],

       [[ 4, 30],
        [ 4,  2]]])
>>> ist_gebiet = np.array([[False, True ],[False, True]])
>>> ist_gebiet
array([[False,  True],
       [False,  True]])
# Zwischenergebnis: Gesamtereignishöhe pro Gitterzelle (in mm)
array([[12, 60],
       [12,  6]])
# Ergebnis: mittlere Gebietsniederschlagshöhe
# 33 mm
In [ ]:
def gebietsniederschlag(precip, ist_gebiet):
    pass
In [ ]:
testme(gebietsniederschlag)

Gesamtauswertung

In [ ]:
get_certificate(testmysolutions=[dimensionen, wie_oft, mhq, n_pegel, nminventur,
                                 maxort, direktabflussvolumen, gebietsniederschlag], lesson=5)
In [ ]: