Aufgaben: Kernfunktionen von Bibliotheken#
Herausforderung an die Praktikums-Vorbereitung: Wie können wir einigermaßen systematisch viele, viele Aufgaben generieren? A: Wir nehmen gängige Bibliotheken, und simulieren mit unseren Mitteln einige Kernfunktionen. Das hat auch den Vorteil, dass die Studierenden diese Biblotheken und Kernfunktionen kennlernen und in ihrer Funktion vaerstanden haben.
Sicherlich implementieren die Bibliotheken diese Funktionen sehr viel performanter als wir das tun. Und oft sind die Python-Bibliotheken auch lediglich Wrapper um altgediente und hochperformante Implementierungen in C.
Random#
Aufgabe: Ziehen aus der Urne ohne/mit Zurücklegen (R1)#
Was üben wir:
Arbeiten mit Listen, Auswählen von Elementen, Schleifen
Doku lesen und kennen
Gegeben ist die Funktion random.randint(a, b)
(siehe https://docs.python.org/3/library/random.html), sowie
eine Liste
population
, z.B.population = list('aeiou)
eine natürliche Zahl
n
Gesucht: Simulieren Sie mit random.randint die folgenden Funktionen aus https://docs.python.org/3/library/random.html:
my_coice:
random.choice(population)
my_choices:
random.choices(population, k=n)
(also mit zurücklegen)my_sample:
random.sample(population, k=n)
(also ohne zurücklegen)my_shuffle:
random.shuffle(population)
import random
Aufgabe: Wie sind die Würfel gefallen?#
Vorbereitung:
Erzeugen Sie mit der Bibliothek random.choices eine Liste
Wuerfe
vonn = 20
Zahlen, wie sie beim Würfeln mit 2 Würfeln entstehen könnte.
n = 100
Seiten = [1,2,3,4,5,6]
Wuerfe_1 = random.choices(Seiten, k=n)
Wuerfe_2 = random.choices(Seiten, k=n)
... #
print(Wuerfe)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[2], line 6
4 Wuerfe_2 = random.choices(Seiten, k=n)
5 ... #
----> 6 print(Wuerfe)
NameError: name 'Wuerfe' is not defined
grundlegende Statistiken#
Berechnen Sie aus dieser Liste den kleinsten und den größten Wert, die Summe, den Mittelwert, die Standardabweichung.
Standardisieren Sie die Liste (vgl. https://de.wikipedia.org/wiki/Standardisierung_(Statistik)). Das geht ganz einfach: Ziehen sie von jeder Zahl den Mittelwert ab und teilen dann durch die Standardabweichung.
Berechnen Sie den Mittelwert und die Standardabweichung der standardisierten Liste: Was fällt auf?
Berechnen Sie den Median.
Sortieren eines Dicts#
Gegeben:
ein Dict, das die Häufigkeit von Würfelsummen angibt
z.B.
haeufigkeit = {9: 4, 10: 2, 3: 3, 2: 1, 8: 1, 7: 5, 12: 1, 5: 2, 4: 1}
Gesucht:
das dict nach den Keys sortiert
haeufigkeit = {9: 4, 10: 2, 3: 3, 2: 1, 8: 1, 7: 5, 12: 1, 5: 2, 4: 1}
... #
andere Lösung:
{ k:v for k,v in sorted(haeufigkeit.items(), key= lambda x: x[0] ) }
{2: 1, 3: 3, 4: 1, 5: 2, 7: 5, 8: 1, 9: 4, 10: 2, 12: 1}
Gesucht:
das dict nach den Würfelsummen sortiert
... #
Ellipsis
Histogramm#
Gegeben:
eine Liste der Summe von Würfen mit 2 Würfeln
z.B.
w = [9, 10, 3, 2, 8, 7, 7, 12, 3, 10, 7, 9, 9, 9, 3, 5, 7, 4, 7, 5]
Gesucht:
ein Dict
haeufigkeit
, das zu jeder Würfelsumme die absolute Häufigkeit angibt
Dieses Dict lässt sich dann sortieren.
Gesucht ist dann eine einfache Visualisierung:
drucke für jede Würfelzahl einen Balken aus. Die Balkenlänge entspricht der absoluten Häufigkeit eines Wurfs.
w = [9, 5, 7, 6, 12, 9, 9, 9, 8, 6, 6, 11, 5, 7, 7, 5, 5, 6, 7,
2, 4, 4, 6, 7, 7, 12, 11, 5, 9, 2, 11, 10, 4, 5, 9, 7, 7,
3, 8, 6, 10, 8, 8, 5, 9, 8, 7, 5, 4, 6, 7, 7, 2, 8, 5, 10,
6, 8, 9, 10, 2, 9, 10, 9, 5, 6, 9, 3, 8, 4, 8, 5, 4, 5, 7,
7, 7, 10, 4, 11, 8, 12, 9, 7, 6, 8, 2, 8, 5, 6, 4, 4, 8, 5,
8, 3, 6, 5, 4, 5]
haeufigkeit = {}
for x in w:
if not x in haeufigkeit:
haeufigkeit[x] = 1
else:
haeufigkeit[x] += 1
haeufigkeit
{9: 12, 5: 16, 7: 15, 6: 12, 12: 3, 8: 14, 11: 4, 2: 5, 4: 10, 10: 6, 3: 3}
h_sortiert_keys = {2: 5, 3: 3, 4: 10, 5: 16} # Beispiel
# haeufigkeit nach key sortieren
... #
h_sortiert_keys
{2: 5, 3: 3, 4: 10, 5: 16}
histogramm_liste = [ # Beispiel
' 2: xxxxx',
' 3: xxx',
' 4: xxxxxxxxxx',
' 5: xxxxxxxxxxxxxxxx'] # usw.
# hier die histogramm_liste programmieren:
... #
print("\n".join(histogramm_liste))
2: xxxxx
3: xxx
4: xxxxxxxxxx
5: xxxxxxxxxxxxxxxx
Matrix-Rechnung#
Typische Aufgaben für Runde 2, denn wir haben es mit verschachtelten Listen zu tun.
Aufgabe: Normalisierung der Zeilen einer Matrix (R1)#
Mit den eingebauten Datenstrukturen von Python kann man eine Matrix als eine Liste von gleichlangen Listen darstellen.
Matrix_2mal3 = [ # 2 Zeilen, 3 Spalten
[ 11, 12, 13 ],
[ 21, 22, 23 ]
]
Gegeben:
Eine 2 mal 3-Matrix
z.B.
Matrix_2mal3
Gesucht:
Liste der Zeilensummen
Liste der Spaltensummen
(In einer Matrix sind alle Zeilen gleich lang.)
def zeilensummen(Matrix):
Ergebnis = []
for zeile in Matrix:
summe = 0
for zahl in zeile:
summe += zahl
Ergebnis.append(summe)
return Ergebnis
zeilensummen(Matrix_2mal3)
[36, 66]
def spaltensummen(Matrix):
Ergebnis = []
for i in range( len(Matrix[0]) ):
Summe = 0
for zeile in Matrix:
Summe += zeile[i]
Ergebnis.append(Summe)
return Ergebnis
spaltensummen(Matrix_2mal3)
[32, 34, 36]
Aufgabe: Matrix mal Vektor (R2)#
Um eine Matrix mit einem Vektor zu multiplizieren, muss – in der Sprache der Mathematik – die Spaltenanzahl der Matrix mit der Zeilenanzahl des Vektors übereinstimmen.
z.B. 2x3 - Matrix aus https://simpleclub.com/lessons/mathematik-matrixvektormultiplikation
# Werte siehe
# https://simpleclub.com/lessons/mathematik-matrixvektormultiplikation
# 2x3 - Matrix
B = [ # 2 Zeilen, 3 Spalten
[ 1, 3, -1 ],
[ 5, 2, 1 ]]
In der Sprache der Mathematik ist v
ein Spalten-Vektor, den man in unserem Beispiel korrekterweise so notieren müsste:
v_spaltenvektor = [ [1], [-1], [2] ] # Spaltenvektor als 3 mal 1-Matrix
Diese mathematisch eingentlich korrekte Notation als Spaltenvektor ist etwa praxisfern. Wir notieren unseren Vektor einfacher (aber mathematisch nicht ganz korrekt) wie oben als (Zeilen-) Vektor:
v = [ 1, -1, 2 ]
Gegeben:
eine n mal m-Matrix, alse eine Liste von Listen zeilenweise notiert
z.B. obige Matrix
B
ein Vektor mit m Spalten (sic!)
z.B. obigen Vektor
v
Gesucht:
Eine Funktion
matrix_mal_vektor(m, v)
, die die Matrixm
mit dem Vektorv
multipliziert.
def matrix_mal_vektor(Matrix, Vektor):
#print(f"{B=}")
#print(f"{v=}")
Ergebnis = []
n = len(Matrix) # Anzahl der Zeilen in der Matrix
m = len(v)
for zeile in Matrix:
... #
... #
... #
... #
... #
return Ergebnis
Cell In[15], line 14
... #
^
IndentationError: unexpected indent
matrix_mal_vektor(B,v)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[16], line 1
----> 1 matrix_mal_vektor(B,v)
NameError: name 'matrix_mal_vektor' is not defined
sorted#
sorted()
mit Parameter key:
https://docs.python.org/3/howto/sorting.html
Gegeben eine Liste von Datumsangaben als String:
datums = [ "2022.12.24", "2021.12.26", "2020.12.02" ]
Gesucht: diese Liste
aufsteigend sortiert
aufsteigend sortiert nach dem Tag