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.
def beispiel(x, y):
ergebnis = x + y
return(ergebnis)
beispiel(1,1)
beispiel(2,-3)
from testzentrum import *
import numpy as np
Kurze Aufwärmübung: Die Funktion dimensionen soll für den NumPy-Array x die Zahl der Dimensionen zurückgeben.
def dimensionen(x):
pass
testme(dimensionen)
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
def wie_oft(hq, x):
pass
testme(wie_oft)
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]
def mhq(hq):
pass
testme(mhq)
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
def n_pegel(hq, x):
pass
testme(n_pegel)
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.
def nminventur(nmin, m, n, j):
pass
testme(nminventur)
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).
def maxort(precip):
pass
testme(maxort)
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³
def direktabflussvolumen(precip, psi):
pass
testme(direktabflussvolumen)
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
def gebietsniederschlag(precip, ist_gebiet):
pass
testme(gebietsniederschlag)
get_certificate(testmysolutions=[dimensionen, wie_oft, mhq, n_pegel, nminventur,
maxort, direktabflussvolumen, gebietsniederschlag], lesson=5)