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 von n = 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 Matrix m mit dem Vektor v 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