Software Engineering II: Vorlesung Kapitel 3 (Wintersemester 2024/25) PDF

Document Details

IllustriousWoodland5113

Uploaded by IllustriousWoodland5113

FH Münster University of Applied Sciences

Prof. Dr. Norman Lahme-Hütig

Tags

NumPy scientific computing Python programming

Summary

These lecture notes, for Software Engineering II, provide an overview of NumPy for scientific computing. They use examples in Python, including the usage of NumPy. The presentation also reviews essential topics like arrays and their creation, as well as operations like broadcasting and matrix multiplication. This material is a presentation of concepts important for undergraduate students in computer science and related fields..

Full Transcript

Software Engineering II Vorlesung | Kapitel 3 Wintersemester 2024/25 Prof. Dr. Norman Lahme-Hütig Informatik/Wirtschaftsinformatik, Schwerpunkt Web Engineering Corrensstraße 25 fon +49 (0)251.83 65-190 [email protected] D-48149 Münster fax +49 (0)251.83 65-525 www.fh-muens...

Software Engineering II Vorlesung | Kapitel 3 Wintersemester 2024/25 Prof. Dr. Norman Lahme-Hütig Informatik/Wirtschaftsinformatik, Schwerpunkt Web Engineering Corrensstraße 25 fon +49 (0)251.83 65-190 [email protected] D-48149 Münster fax +49 (0)251.83 65-525 www.fh-muenster.de Kapitel 3 Wissenschaftliches Rechnen mit NumPy Œ Einleitung  Zentrale Datenstruktur Ž Grundlegende Operationen  Weiterführende Operationen Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) 2 Einleitung NumPy ist ein grundlegendes Open-Source-Paket für wissenschaftliches Rechnen mit Python § Entwickelt von Travis E. Oliphant durch Zusammenführung von Numeric und Numarray § Grundlage für viele weitere Python-Pakete (z. B. Pandas) Webseiten § Hauptseite: https://numpy.org § Quellcode: https://github.com/numpy/numpy Installation $ pip install numpy Bildquelle: https://numpy.org Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.1 Einleitung 3 Einleitung Wesentliche Merkmale § Homogene mehrdimensionale Arrays sowie zahlreiche Operationen auf diesen § Speichereffizienter als Python-Sequenzen Daten werden intern in einem zusammenhängenden Speicherblock abgelegt § Vektorisierte Array-Operationen Ausführung komplexer Operationen auf ganzen Arrays ohne Iterieren über die Array- Elemente § Flexible Broadcasting-Fähigkeit § Funktionen zur Linearen Algebra, Statistik etc. § C-API zur einfachen Anbindung von Programmen, die in C, C++ oder Fortran geschrieben sind Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.1 Einleitung 4 Einleitung Beispiel zum Leistungsunterschied import numpy as np from timeit import timeit SIZE = 1000000 COUNT = 100 my_array = np.arange(SIZE) nparray_duration = timeit(lambda: my_array * 2, number=COUNT) print(f'nparray: {nparray_duration:.4f} s') my_list = list(range(SIZE)) list_duration = timeit(lambda: [x * 2 for x in my_list], number=COUNT) print(f'list : {list_duration:.4f} s') # nparray: 0.1065 s # list : 2.5244 s Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.1 Einleitung 5 Kapitel 3 Wissenschaftliches Rechnen mit NumPy Œ Einleitung  Zentrale Datenstruktur Ž Grundlegende Operationen  Weiterführende Operationen Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) 6 Arrays Ein ndarray-Objekt ist ein mehrdimensionaler Container, dessen Elemente gleichen Typs sind import numpy as np [[1 2 3] a = np.array([[1, 2, 3], [3, 4, 5]]) # 2x3-Matrix [3 4 5]] a.shape # => (2, 3) Grundlegende Instanzattribute Attribut Erläuterung ndim Anzahl Achsen (Dimensionen) shape Tupel, das für jede Achse ihre Größe enthält, z. B. (n, m) für n x m-Matrix size Anzahl aller Elemente dtype Datentyp aller Elemente itemsize Größe jedes Elements in Bytes Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.2 Zentrale Datenstruktur 7 Arrays erzeugen Anhand expliziter Werte 1-dimensionales Array a = np.array([1, 2, 3]) [1 2 3] 2-dimensionales Array a = np.array([[1, 2, 3], [3, 4, 5]]) [[1 2 3] [3 4 5]] Die Werte können auch als Tupel oder Ranges übergeben werden 1-dimensionales Array: Kompakte Form a = np.r_[0, 2:4, [6, 7], np.array([8, 9])] [0 2 3 6 7 8 9] Die Werte können durch ein beliebige Kombination von Skalaren, Slices, Listen, Tupeln, Ranges und Arrays angegeben werden Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.2 Zentrale Datenstruktur 8 Arrays erzeugen Anhand von Hilfsfunktionen Mit Nullen a = np.zeros(3) [0. 0. 0.] Mit Einsen a = np.ones((2, 3)) [[1. 1. 1.] [1. 1. 1.]] Mit fortlaufenden Werten a = np.arange(0, 5) [0 1 2 3 4] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.2 Zentrale Datenstruktur 9 Arrays erzeugen Anhand von Hilfsfunktionen Mit gleichmäßigem Abstand a = np.linspace(0, 10, 5) [ 0. 2.5 5. 7.5 10. ] Einheitsmatrix a = np.identity(2) # 2x2 Matrix [[1. 0.] [0. 1.]] Mit Werten anhand einer Funktion f = lambda m, n: n + 10 * m [[ 0. 1. 2.] a = np.fromfunction(f, (2, 3)) [10. 11. 12.]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.2 Zentrale Datenstruktur 10 Arrays erzeugen Angabe des Datentyps Beim Erzeugen eines Arrays kann der Datentyp mit angegeben werden a = np.array([1, 2, 3], dtype=np.int32) a = np.arange(0, 5, dtype='i4') Typ Typcode Erläuterung int8, int16, int32, int64 'i1', 'i2', 'i4', 'i8' Integer (vorzeichenbehaftet, 8-64 Bit) uint8, uint16, uint32, uint64 'u1', 'u2', 'u4', 'u8' Integer (vorzeichenlos, 8-64 Bit) float16, float32, float64, 'f2', 'f4', 'f8', 'f16' Gleitkommazahlen (16 - 128 Bit) float128 complex64, complex128, 'c8', 'c16', 'c32' Komplexe Zahlen (Kombination complex256 zweier Gleitkommazahlen) bool '?' Boolean str_ U String fixer Länge, z. B. 'U10' StringDType() String variabler Länge object O Python-Objekt (beliebig) Anmerkung: Der Datentyp kann auch nachträglich geändert werden, z. B. a1 = a.astype('i2') Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.2 Zentrale Datenstruktur 11 Arrays erzeugen Angabe des Datentyps Strukturierte Arrays Der Datentyp kann sich aus anderen, optional beschrifteten Datentypen zusammensetzen a = np.array( [('John', 21) ('Bob', 42)] [('Alice', 21), ('Bob', 42)], dtype= [('name', np.str_, 10), ('age', 'i1')]) Auf diese Weise kann eine tabellarische Struktur mit heterogenen Spalten erzeugt werden Für tabellarische Strukturen ist jedoch die Bibliothek Pandas zu bevorzugen Zugriff auf die Spalten Über die Beschriftung kann auf die Daten einer Spalte zugegriffen werden a1 = a['age'] # a1: NumPy-Array [21 42] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.2 Zentrale Datenstruktur 12 Kapitel 3 Wissenschaftliches Rechnen mit NumPy Œ Einleitung  Zentrale Datenstruktur Ž Grundlegende Operationen  Weiterführende Operationen Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) 13 Form des Arrays verändern Transponieren Betrachtetes Array [[1 2] a2 = a.T [[1 3] [3 4]] [2 4]] 1-dimensionales Array erzeugen a2 = a.ravel() [1 2 3 4] Anmerkung Beide Operationen erzeugen ein neues Array; das ursprüngliche Array bleibt unberührt Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 14 Form des Arrays verändern Methode reshape() Betrachtetes Array [0 1 2 3 4 5] a2 = a.reshape((2, 3)) [[0 1 2] [3 4 5]] Methode resize() a.resize((2, 3)) [[0 1 2] [3 4 5]] Anmerkung Bei resize() wird das Array modifiziert, bei reshape() wird ein neues Array erzeugt Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 15 Arrays stapeln Vektoren zu Matrizen stapeln Als Spaltenvektoren Betrachtete Arrays [1 2 3] a = np.column_stack((a1, a2)) [[1 4] [2 5] [4 5 6] [3 6]] Als Zeilenvektoren a = np.vstack((a1, a2)) [[1 2 3] [4 5 6]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 16 Arrays stapeln Arrays entlang einer Achse stapeln Vertikal stapeln (Achse 0) Betrachtete Arrays [[0 1] a = np.concatenate((a1, a2), axis=0) [[0 1] [2 3]] [2 3] [4 5] [[4 5] [6 7]] [6 7]] Horiziontal stapeln (Achse 1) a = np.concatenate((a1, a2), axis=1) [[0 1 4 5] [2 3 6 7]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 17 Elemente selektieren Überblick Über Indizierung kann ein einzelnes Element oder ein Ausschnitt eines Arrays Betrachtete Arrays selektiert werden [0 1 2 3] v = a2[2, 1] 7 [[0 1 2] [3 4 5] Alternative Argumente [6 7 8]] Argument Beispiel 1-dim. Array Beispiel 2-dim. Array Einzelne Werte a1 a2[0, 0] Index-Arrays a1[[0, 1]] a2[np.array([0, 1])] Slices a1[2:] a2[0:2, 0:2] Zudem sind boolesche Arrays erlaubt Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 18 Elemente selektieren Index Arrays Zum Indizieren können auch NumPy-Arrays, Listen etc. (jedoch keine Tupel) von Betrachtete Arrays Index-Werten verwendet werden [10 20 30 40] Mehrere Werte eines 1-dim. Arrays [[0 1 2] [3 4 5] a = a1[np.array([0, 2])] [10 30] [6 7 8]] Mehrere Zeilen eines 2-dim. Arrays a = a2[[0, 2]] [[0 1 2] [6 7 8]] Mehrere Werte eines 2-dim. Arrays a = a2[[0, 2], [1, 2]] [1 8] Die beiden Listen müssen grundsätzlich gleich groß sein (Broadcasting ist möglich) Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 19 Elemente selektieren Boolean Index Arrays Statt Index-Werte sind auch boolesche Werte zum Selektieren möglich Betrachtete Arrays [10 20 30 40] Mehrere Werte eines 1-dim. Arrays [[0 1 2] a = a1[[True, False, True, False]] [10 30] [3 4 5] [6 7 8]] Mehrere Zeilen eines 2-dim. Arrays a = a2[[True, False, True]] [[0 1 2] [6 7 8]] Mehrere Werte eines 2-dim. Arrays a = a2[[True, False, True], [False, True, True]] [1 8] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 20 Elemente selektieren Slicing Die Syntax ist analog zur Slicing-Syntax bei Python-Sequenzen Betrachtetes Array [[0 1 2] Zeile selektieren [3 4 5] [6 7 8]] a1 = a[0, :] [0 1 2] Spalte selektieren a1 = a[:, 0] [0 3 6] Teilmatrix selektieren a1 = a[0:2, 0:2] [[0 1] [3 4]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 21 Mikroübung Quellcode-Analyse Welche Ausgabe produziert das folgende Python-Skript? import numpy as np a = np.arange(1, 7).reshape(3, 2) a = a.T print(a[:, 0]) Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 22 Iterieren Iterieren über die Zeilenvektoren einer Matrix Betrachtetes Array [[0 1 2] for row in a: [0 1 2] [3 4 5] print(row) [3 4 5] [6 7 8]] [6 7 8] Iterieren über die Spaltenvektoren einer Matrix for col in a.T: [0 3 6] print(col) [1 4 7] [2 5 8] Iterieren über alle Elemente for elem in a.flat: 0 1 2 3 4 5 6 7 8 print(elem, end=' ') Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 23 Views vs. Kopien Views Bestimmte Operationen, wie das Slicing oder Reshapen, erzeugen eine View auf das ursprüngliche Array a1 = np.arange(0, 12).reshape(3, 4) a2 = a1[0, :] # => View (ndarray-Objekt) a2 = 42 a1[0, 0] # => 42 Kopien a1 = np.arange(0, 12).reshape(3, 4) a2 = a1[0, :].copy() # => ndarray-Objekt (keine View) a2 = 42 a1[0, 0] # => 0 Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 24 Vektorisierte Operationen Eine vektorisierte Operation ist eine Operation, die auf ganzen Arrays operiert Betrachtete Arrays a = a1 + a2 [[1 2] [3 4]] Ohne Vektorisierung ist die Operation einzeln für alle Elemente aufzurufen [[5 6] a = np.zeros((2, 2)) [7 8]] for i in range(0, 2): for j in range(0, 2): a[i, j] = a1[i, j] + a2[i, j] Vorteile § Kompakterer Quellcode § Effizientere Berechnung auf modernen CPUs, die SIMD (Single Instruction, Multiple Data) unterstützen Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 25 Broadcasting Broadcasting ermöglicht es, dass arithmetische und einige weitere Operationen unter Betrachtete Arrays bestimmten Voraussetzungen auch bei inkompatiblen Operanden ausgeführt werden [10 20] können [[1 2] Beispiel: Vektor + Skalar [3 4]] a = a1 + 10 [20 30] Die 10 wird durch Broadcasting erweitert zum 1-dim. Array [10 10] Beispiel: Matrix + Vektor a = a1 + a2 [[11 22] [13 24]] a1 wird durch Broadcasting erweitert zu einem 2-dim. [[10 20] Array [10 20]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 26 Broadcasting Intern werden keine Daten kopiert - die "Stretching"- Analogie ist rein konzeptionell Bildquelle: https://numpy.org/devdocs/user/basics.broadcasting.html Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 27 Broadcasting Voraussetzung Die Dimensionen der beiden Operanden müssen - von hinten startend - paarweise kompatibel sein, d. h., beide müssen gleich groß sein oder eine von beiden muss die Größe 1 aufweisen a1 (2d array): 5 x 4 a2 (1d array): 4 Result (2d array): 5 x 4 a1 (2d array): 5 x 4 a2 (1d array): 1 Result (2d array): 5 x 4 a1 (4d array): 8 x 1 x 6 x 1 a2 (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 5 Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 28 Operatoren Arithmetische Operatoren Arithmetische Operatoren auf Arrays operieren elementweise Betrachtete Arrays [[1 2] Beispiel: Addition [3 4]] a = a1 + a2 [[ 6 8] [[5 6] [10 12]] [7 8]] Beispiel: Multiplikation a = a1 * a2 [[ 5 12] [21 32]] Achtung: Keine Matrixmultiplikation! Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 29 Operatoren Zuweisung: Elemente ersetzen Über Indizieren kombiniert mit einer Zuweisung können einzelne Werte bzw. Bereiche Betrachtetes Array ersetzt werden, wobei Broadcasting unterstützt wird [[0 1 2] [3 4 5]] Einzelnen Wert ersetzen a[1, 2] *= 10 [[ 0 1 2] [ 3 4 50]] Bereich ersetzen a[1, :] = 10 * a[0, :] [[ 0 1 2] [ 0 10 20]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 30 Operatoren Vergleichsoperatoren Bei einem Vergleich von Arrays ist das Ergebnis ein Array boolescher Werten Betrachtetes Array Hierbei ist auch Broadcasting möglich [-1 2 5] a = a1 > 0 [False True True] Dabei sind auch komplexere Ausdrücke möglich1 a = (a1 > 0) & (a1 < 5) [False True False] Kombination mit Boolean Index Arrays Ein Ausschnitt eines Arrays kann anhand eines booleschen Ausdrucks elegant ermittelt werden a = a1[a1 % 2 == 1] [-1 5] 1 Logische Operatoren: & (Und), | (Oder), ^ (Exklusives Oder), ~ (Nicht) Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 31 Operatoren Arithmetischen Operationen mit booleschen Arrays Boolesche Arrays werden bei arithmetischen Operationen in numerische Arrays Betrachtetes Array umgewandelt [-10 10 -20 20] Boolescher Wert Numerischer Wert True 1 False 0 Beispiel a = 1 * (a1 > 0) [0 1 0 1] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 32 Funktionen Universelle Funktionen Eine universelle Funktion (ufunc) ist eine Funktion, die auf einem Array elementweise Betrachtetes Array operiert [ 1 4 9 16] Beispiel: Quadratwurzel a = np.sqrt(a1) [1. 2. 3. 4.] Beispiel: Potenzieren a = np.power(a1, 2) [ 1 16 81 256] Weitere universelle Funktionen sind u. a. § np.log(), np.log2(), np.log10() § np.cos(), np.sin(), np.tan() § np.floor(), np.ceil(), np.round() § np.sign(), np.abs() Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 33 Funktionen Aggregatfunktionen Aggregatfunktionen operieren auf mehreren Elementen des Arrays Betrachtetes Array [[10 20] Beispiel: sum() [30 40]] v = a.sum() 100 Beispiel: argmax() v = a.argmax() 3 Index der größten Zahl (bezogen auf a.ravel()) Weitere Funktionen sind u. a. § a.min(), a.max() § a.argmin() § a.mean(), a.var(), a.std() (Mittelwert, Varianz, Standardabweichung) Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 34 Funktionen Aggregatfunktionen: Achsenbezug Kein Achsenbezug (Alle Elemente) Betrachtetes Array [[10 20] v = a1.sum() 100 [30 40]] Beschränkung auf Achse 0 a = a1.sum(axis=0) [40 60] Addition der Zeilenvektoren Beschränkung auf Achse 1 a = a1.sum(axis=1) [30 70] Addition der Spaltenvektoren Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 35 Funktionen Sonstige Funktionen Sortieren Betrachtetes Array Sortierte Kopie eines Arrays [[-2 1 5] [ 4 -1 3]] a = np.sort(a1, axis=1) [[-2 1 5] [-1 3 4]] Array selbst sortieren a1.sort(axis=0) [[-2 -1 3] [ 4 1 5]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 36 Funktionen Sonstige Funktionen Indirektes Sortieren Betrachtetes Array [[-20 30 10] a = a1.argsort(axis=1) [[0 2 1] [ 40 -10 30]] [1 2 0]] Die Einträge des Ergebnis-Arrays sind Indizes, die sich auf das Ursprungs-Array beziehen Bedingte Auswahl von Elementen Die Funktion where() ist eine vektorisierte Version eines Python-Ausdrucks der Form x if condition else y a = np.where(a1 > 0, a1, 0) [[ 0 30 10] [40 0 30]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 37 Mikroübung Richtig oder falsch? Œ Beim Reshapen eines Arrays haben Änderungen am Ergebnis-Array Auswirkungen auf das Ursprungs-Array  Zur elementweisen Addition zweier dreidimensionaler Arrays sind drei ineinander verschachtelte Schleifen nötig Ž Dank Broadcasting können Operationen stets auch auf inkompatiblen Operanden ausgeführt werden  Eine Matrixmultiplikation erfolgt über den * Operator, z. B. a1 * a2  Beim Ersetzen von Elementen eines Arrays wird Broadcasting unterstützt Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.3 Grundlegende Operationen 38 Kapitel 3 Wissenschaftliches Rechnen mit NumPy Œ Einleitung  Zentrale Datenstruktur Ž Grundlegende Operationen  Weiterführende Operationen Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) 39 Erzeugung von Pseudozufallszahlen NumPy ermöglicht die vektorisierte Generierung von Pseudozufallszahlen für verschiedene Verteilungen Pseudozufallszahlen-Generator erzeugen import numpy as np rng = np.random.default_rng(42) # 42: Seed-Wert Durch das explizite Setzen eines Seed-Werts sind die Zufallszahlen reproduzierbar Gleichverteilte Zufallszahlen erzeugen a = rng.uniform(low=0, high=10, size=(3, 2)) # Array mit 3 Zeilen und 2 Spalten § Wertebereich ist das Intervall [low, high) mit dem Default [0, 1) § Parameter size definiert die Form des Ergebnisses; per Default wird 1 Zufallszahl als Skalar erzeugt Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.4 Weiterführende Operationen 40 Erzeugung von Pseudozufallszahlen Normalverteilte Zufallszahlen erzeugen a = rng.normal(loc=0, scale=1, size=(3, 2)) § Parameter loc definiert den Erwartungswert (Default: 0) § Parameter scale legt die Standardabweichung fest (Default: 1) Funktionen zu weitere Verteilungen (Auswahl) beta(), binomial(), exponential(), gamma(), geometric(), hypergeometric(), logistic(), multinomial(), poisson(), wald(), zipf() Zufällige Permutation einer Sequenz erzeugen a = rng.permutation([1, 4, 9, 12, 15]) # z. B. [12 9 15 1 4] Bei einem Skalar s als Argument wird eine Permutation der Sequenz np.arange(s) erzeugt Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.4 Weiterführende Operationen 41 Lineare Algebra Skalarprodukt Betrachtete Arrays [1 2 3] v = a1.dot(a2) 32 v = a1 @ a2 # alternativ mit Operator [4 5 6] Matrixmultiplikation [[1 2] [3 4]] a = a3.dot(a4) [[19 22] a = a3 @ a4 # alternativ mit Operator [43 50]] [[5 6] [7 8]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.4 Weiterführende Operationen 42 Lineare Algebra Lösen linearer Gleichungssysteme Betrachtete Arrays [[2 3] x = np.linalg.solve(A, b) [1. 2.] [1 2]] Determinante einer Matrix [8 5] v = np.linalg.det(A) 1.0 Inverse einer Matrix A2 = np.linalg.inv(A) [[ 2. -3.] [-1. 2.]] Prof. Dr. Norman Lahme-Hütig | Software Engineering II (2024/25) | 3 Wissenschaftliches Rechnen mit NumPy ▸ 3.4 Weiterführende Operationen 43

Use Quizgecko on...
Browser
Browser