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 (m
xn
) 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)