Skip to content
Snippets Groups Projects
Commit d3768a3d authored by Christof Kaufmann's avatar Christof Kaufmann
Browse files

Notebooks from applied-cs/data-science@a8ca9af1

parent dc640d4c
No related branches found
No related tags found
No related merge requests found
x1,x2,x3,y
25,1,20,0
5,16,2,1
13,21,13,1
17,9,11,0
21,17,13,1
\ No newline at end of file
%% Cell type:markdown id: tags:
# Code zu Folien
Dieses Skript bzw. Jupyter-Notebook enthält den Code, der auch auf den Folien "Python Vertiefung" enthalten ist. Zum Vorbereiten, Mitmachen oder Nacharbeiten.
%% Cell type:code id: tags:
```
a = [1, 3, 5]
b = a # b ist eine weitere Referenz
print(a, b)
b[1] = 10 # ändere Objekt, das b referenziert
print(a, b)
```
%% Cell type:code id: tags:
```
a = [1, 3, 5]
b = a # b ist eine weitere Referenz
c = [1, 3, 5] # zweites Objekt
print(a == b, a is b) # a und b sind dasselbe Objekt
print(a == c, a is c) # a und c sind gleich, aber verschiedene Objekte
```
%% Cell type:code id: tags:
```
a = [1, [3], 5] # Objekt in Objekt
b = a.copy() # b ist eine flache Kopie
print(a, b)
b[0] = 2 # ändere Objekt auf das b referenziert
b[1].append(4) # ändere Objekt auf das das Objekt referenziert auf das b referenziert
print(a, b)
```
%% Cell type:code id: tags:
```
t = (1, 2, 3)
a, b, c = t # auf der linken Seite darf ein Tupel oder eine Liste von Variablen stehen
def fun(x, y, z):
print(x, y, z)
t = (1, 2, 3) # Reihenfolge wird beibehalten
fun(*t) # ergibt: 1 2 3
d = {'z':1, 'y':2, 'x':3} # Reihenfolge ist hier unwichtig, aber Namen müssen übereinstimmen
fun(**d) # ergibt: 3 2 1
```
%% Cell type:code id: tags:
```
def fun(*args):
print(len(args), 'Argumente:', args)
fun(1, 2, 3) # ergibt: 3 Argumente: (1, 2, 3)
fun('hello', 'python') # ergibt: 2 Argumente: ('hello', 'python')
def fun(**kwargs):
print(len(kwargs), 'Argumente:', kwargs)
fun(y=1, x=2, z=3) # ergibt: 3 Argumente: {'y': 1, 'x': 2, 'z': 3}
def fun(*args, **kwargs):
print('args:', args, 'kwargs:', kwargs)
fun(1, 2, x=3, y=4) # ergibt args: (1, 2) kwargs: {'x': 3, 'y': 4}
```
%% Cell type:code id: tags:
```
def f(a, b):
return a(b)
f(print, 'test') # normale print-Funktion übergeben
def arg_fun(s):
return s * 2
print(f(arg_fun, 'test'))
arg_fun = lambda s: s * 2 # analog zu def arg_fun(s): return s * 2
print(f(arg_fun, 'test'))
print(f(lambda s: s * 2, 'test')) # analog zu def arg_fun(s): return s * 2
```
%% Cell type:code id: tags:
```
def multiplier(a):
def multiply(b):
return a * b
return multiply
five_times = multiplier(5)
ten_times = multiplier(10)
print(five_times(6))
print(ten_times(1))
```
%% Cell type:code id: tags:
```
def make_stars(fun):
def wrapped_in_stars():
print('*' * 30)
fun() # call original function
print('*' * 30)
return wrapped_in_stars
@make_stars
def hello_stars():
print('Hello, stars! :-)')
# starred = make_stars(hello_stars)
# starred()
# hello_stars = make_stars(hello_stars)
hello_stars()
```
%% Cell type:code id: tags:
```
import numpy # numpy steht über numpy zur Verfügung
print(numpy.pi)
import numpy as np # numpy steht über np zur Verfügung (üblich)
print(np.pi)
from numpy import pi # nur numpy.pi steht über pi zur Verfügung
print(pi)
```
%% Cell type:code id: tags:
```
# check current working directory – must be in the same directory as mymodule.py
import os
assert 'mymodule.py' in os.listdir(), f'mymodule.py is not in the current working directory of the python interpreter. You are here: {os.getcwd()}'
# try code from slide
import mymodule # gibt nur beim ersten Import etwas aus
mymodule.say_hello('you')
print(mymodule.__file__)
help(mymodule) # Hilfe anzeigen
```
%% Cell type:code id: tags:
```
# gibt nur beim ersten Import etwas aus
import mypackage
from mypackage.mymod import say_hello
mypackage.say_hello('you')
say_hello('you')
# hier muss das Modul "more" explizit importiert werden, da die Init-Datei leer ist
import mypackage.subpackage.more
mypackage.subpackage.more.say_bye()
```
%% Cell type:code id: tags:
```
f = open('data.csv')
header = f.readline()
print(header)
# for line in f.readlines(): # iteriert über alle Zeilen
for line in f: # oder kürzer: for line in f: iteriert auch über alle Zeilen
print(line.strip()) # strip entfernt \n um Leerzeilen zu vermeiden
f.close()
```
%% Cell type:code id: tags:
```
f = open('test.md', mode='w')
f.write('# Schreibtest\n\n')
print('Kleiner Test', file=f)
f.writelines(['\n', '- bli\n', '- bla\n'])
f.write('\n'.join(['', '- blupp', '- blupp\n']))
f.close()
# Ausgabe der Datei
f = open('test.md')
print(f.read())
f.close()
```
%% Cell type:code id: tags:
```
f = open('data.csv')
print(f.closed)
f.close()
print(f.closed)
with open('data.csv') as f:
# innerhalb dieses Blocks ist die Datei offen
header = f.readline()
print(f.closed) # ergibt: False
# außerhalb des Blocks ist die Datei geschlossen
print(f.closed) # ergibt: True
print(header)
```
%% Cell type:code id: tags:
```
p = 'summe.ipynb' # relativer Pfad zu einer Datei
dirname, filename = os.path.split(p) # splitte Pfad in Verzeichnis und Datei
base, ext = os.path.splitext(filename) # splitte Datei in Basis und Erweiterung
print(dirname, filename, base, ext, sep=', ')
absdir = os.path.abspath(dirname) # wandle dirname zu absoluten Pfad um
absfile = os.path.join(absdir, base + '.py') # fügt mit Pfadtrenner zusammen
print(absfile)
```
%% Cell type:code id: tags:
```
import pathlib
p = pathlib.Path('summe.ipynb') # relativer Pfad zu einer Datei
abs_p = p.absolute() # wandle p zu absoluten Pfad um (hier: irrelevant)
abs_py = abs_p.with_suffix('.py') # Dateinamenserweiterung tauschen
print(abs_py)
framework_dir = abs_p.parent.parent # gehe zweimal "hoch"
print(framework_dir) # (ginge auch relativ: PosixPath('..'))
prod_ex = framework_dir / 'funktionen' / 'prod.py' # füge mit Pfadtrenner an
print(prod_ex)
file_content = prod_ex.read_text() # Datei einlesen
prod_ex.with_name('prod_copy.py').write_text(file_content) # Datei schreiben
```
%% Cell type:code id: tags:
```
from glob import glob
files = glob('~/data-science-notebooks/*grundlagen/*-sol.ipynb')
print(files)
files = glob('~/data-science-notebooks/**/[g-h]*-sol.ipynb', recursive=True)
print(files)
paths = pathlib.Path('..').glob('**/[a-g]*.ipynb')
print(list(paths))
```
%% Cell type:code id: tags:
```
def nthroot(x: float, n: float = 2) -> float:
"""nth root of a number
Parameters
----------
x : float or int
Number to take the root from.
n : float or int, optional
Root parameter (the default is 2).
Returns
-------
float
The nth root.
"""
return x ** (1/n)
help(nthroot)
print(nthroot(3, 3))
print(nthroot('asd', 3)) # um hier den Fehler sehen zu können, sollte mypy als Paket und VS Code Erweiterung installiert sein
```
%% Cell type:code id: tags:
```
from pathlib import Path
def tabs_to_spaces(filename):
if '*' in filename:
raise InvalidFileName(f'Filenames with * are not allowed: {filename}') # message if not caught
# raise ValueError(f'Filenames with * are not allowed: {filename}') # message if not caught
p = Path(filename)
file_contents = p.read_text().replace('\t', ' ')
p.write_text(file_contents)
class InvalidFileName(Exception):
pass
filenames = ['data.csv', 'does-not-exist', '*.csv']
for filename in filenames:
try:
tabs_to_spaces(filename)
except FileNotFoundError as e:
print(f'File {filename} not found, so also not converted to spaces.')
# except ValueError as e:
except InvalidFileName as e:
print(f'Use proper filenames, not glob syntax. Resolve {filename} before using glob.glob.')
except PermissionError as e: # e enthält die Fehlernachricht als str(e)
print(e, 'Could not convert to spaces.', sep='. ')
```
%% Cell type:code id: tags:
```
def fun():
with open('does-not-exist') as f:
f.read()
fun() # FileNotFoundError
```
%% Cell type:code id: tags:
```
class MyComplex:
def __init__(self, re=0, im=0): # Konstruktor mit zwei "echten" Argumenten
self.re = re
self.im = im
def conjugate(self): # Methode ohne "echte" Argumente
return MyComplex(self.re, -self.im)
def __repr__(self): # wird über repr(z) (und ggf. über str(z)) aufgerufen
return f'MyComplex({self.re}, {self.im})'
def __str__(self): # wird über str(z) aufgerufen
return f'({self.re}{self.im:+}j)'
z1 = MyComplex(3, 4)
z2 = z1.conjugate()
print(f'z1: ({z1.re}, {z1.im})')
print(f'z2: ({z2.re}, {z2.im})')
print(repr(z1))
print(z1) # ruft intern str(z) auf, das als Fallback repr(z) aufrufen würde
```
%% Cell type:code id: tags:
```
class A:
def __bar(self):
print('...not really private...')
a = A()
# a.__bar() # So geht es zwar nicht...
a._A__bar() # aber so
class B:
def _foo(self):
print('foo!')
b = B()
b._foo()
```
%% Cell type:code id: tags:
```
class MyPositiveNumber:
def __init__(self, r=0):
self.r = r
num = MyPositiveNumber(3)
num.r = -8 # schreiben
print(num.r) # lesen, ergibt -8
class MyPositiveNumber:
def __init__(self, r=0):
self.r = r # benutzt schon setter unten
@property # getter
def r(self):
return self._r
@r.setter # setter
def r(self, val):
self._r = val if val > 0 else 0
num = MyPositiveNumber(3)
num.r = -8 # ruft setter auf
print(num.r) # ruft getter auf, ergibt: 0
```
%% Cell type:code id: tags:
```
class MyPositiveComplex(MyPositiveNumber): # erbt von MyPositiveNumber
def __init__(self, r=0, i=0):
super().__init__(r) # rufe Konstruktor von MyPositiveNumber auf
self.i = i # benutzt schon setter unten
@property # getter
def i(self):
return self._i
@i.setter # setter
def i(self, val):
self._i = val if val > 0 else 0
c = MyPositiveComplex(-8, 1)
c.i = -5 # ruft setter auf
print(f'{c.r} + {c.i}j') # ruft getter auf, ergibt: 0 + 0j
```
%% Cell type:code id: tags:
```
class Text:
def __init__(self, text):
self.text = text
@classmethod
def from_file(cls, path):
with open(path) as f:
return cls(f.read())
class GradedText(Text):
def __init__(self, text, grade=None):
super().__init__(text)
self.grade = grade
file = 'data.csv'
t = Text.from_file(file)
print(t.text)
print(type(t))
gt = GradedText.from_file(file)
print(gt.text, gt.grade)
print(type(gt))
```
# %% [markdown]
# # Code zu Folien
#
# Dieses Skript bzw. Jupyter-Notebook enthält den Code, der auch auf den Folien "Python Vertiefung" enthalten ist. Zum Vorbereiten, Mitmachen oder Nacharbeiten.
# %% Referenzen
a = [1, 3, 5]
b = a # b ist eine weitere Referenz
print(a, b)
b[1] = 10 # ändere Objekt, das b referenziert
print(a, b)
# %% Gleichheit und Identität
a = [1, 3, 5]
b = a # b ist eine weitere Referenz
c = [1, 3, 5] # zweites Objekt
print(a == b, a is b) # a und b sind dasselbe Objekt
print(a == c, a is c) # a und c sind gleich, aber verschiedene Objekte
# %% Flache Kopie
a = [1, [3], 5] # Objekt in Objekt
b = a.copy() # b ist eine flache Kopie
print(a, b)
b[0] = 2 # ändere Objekt auf das b referenziert
b[1].append(4) # ändere Objekt auf das das Objekt referenziert auf das b referenziert
print(a, b)
# %% Übergabe an Funktionsargumente
t = (1, 2, 3)
a, b, c = t # auf der linken Seite darf ein Tupel oder eine Liste von Variablen stehen
def fun(x, y, z):
print(x, y, z)
t = (1, 2, 3) # Reihenfolge wird beibehalten
fun(*t) # ergibt: 1 2 3
d = {'z':1, 'y':2, 'x':3} # Reihenfolge ist hier unwichtig, aber Namen müssen übereinstimmen
fun(**d) # ergibt: 3 2 1
# %% Beliebige Anzahl Argumente
def fun(*args):
print(len(args), 'Argumente:', args)
fun(1, 2, 3) # ergibt: 3 Argumente: (1, 2, 3)
fun('hello', 'python') # ergibt: 2 Argumente: ('hello', 'python')
def fun(**kwargs):
print(len(kwargs), 'Argumente:', kwargs)
fun(y=1, x=2, z=3) # ergibt: 3 Argumente: {'y': 1, 'x': 2, 'z': 3}
def fun(*args, **kwargs):
print('args:', args, 'kwargs:', kwargs)
fun(1, 2, x=3, y=4) # ergibt args: (1, 2) kwargs: {'x': 3, 'y': 4}
# %% Funktionen als Objekte
def f(a, b):
return a(b)
f(print, 'test') # normale print-Funktion übergeben
def arg_fun(s):
return s * 2
print(f(arg_fun, 'test'))
arg_fun = lambda s: s * 2 # analog zu def arg_fun(s): return s * 2
print(f(arg_fun, 'test'))
print(f(lambda s: s * 2, 'test')) # analog zu def arg_fun(s): return s * 2
# %% Funktionen als Rückgabewerte / Closure
def multiplier(a):
def multiply(b):
return a * b
return multiply
five_times = multiplier(5)
ten_times = multiplier(10)
print(five_times(6))
print(ten_times(1))
# %% Decorators
def make_stars(fun):
def wrapped_in_stars():
print('*' * 30)
fun() # call original function
print('*' * 30)
return wrapped_in_stars
@make_stars
def hello_stars():
print('Hello, stars! :-)')
# starred = make_stars(hello_stars)
# starred()
# hello_stars = make_stars(hello_stars)
hello_stars()
# %% Module importieren
import numpy # numpy steht über numpy zur Verfügung
print(numpy.pi)
import numpy as np # numpy steht über np zur Verfügung (üblich)
print(np.pi)
from numpy import pi # nur numpy.pi steht über pi zur Verfügung
print(pi)
# %% Eigene Module
# check current working directory – must be in the same directory as mymodule.py
import os
assert 'mymodule.py' in os.listdir(), f'mymodule.py is not in the current working directory of the python interpreter. You are here: {os.getcwd()}'
# try code from slide
import mymodule # gibt nur beim ersten Import etwas aus
mymodule.say_hello('you')
print(mymodule.__file__)
help(mymodule) # Hilfe anzeigen
# %% Eigene Pakete
# gibt nur beim ersten Import etwas aus
import mypackage
from mypackage.mymod import say_hello
mypackage.say_hello('you')
say_hello('you')
# hier muss das Modul "more" explizit importiert werden, da die Init-Datei leer ist
import mypackage.subpackage.more
mypackage.subpackage.more.say_bye()
# %% Dateien lesen
f = open('data.csv')
header = f.readline()
print(header)
# for line in f.readlines(): # iteriert über alle Zeilen
for line in f: # oder kürzer: for line in f: iteriert auch über alle Zeilen
print(line.strip()) # strip entfernt \n um Leerzeilen zu vermeiden
f.close()
# %% Dateien schreiben
f = open('test.md', mode='w')
f.write('# Schreibtest\n\n')
print('Kleiner Test', file=f)
f.writelines(['\n', '- bli\n', '- bla\n'])
f.write('\n'.join(['', '- blupp', '- blupp\n']))
f.close()
# Ausgabe der Datei
f = open('test.md')
print(f.read())
f.close()
# %% Dateien öffnen und schließen mit Kontext-Manager
f = open('data.csv')
print(f.closed)
f.close()
print(f.closed)
with open('data.csv') as f:
# innerhalb dieses Blocks ist die Datei offen
header = f.readline()
print(f.closed) # ergibt: False
# außerhalb des Blocks ist die Datei geschlossen
print(f.closed) # ergibt: True
print(header)
# %% Pfade als Objekt: String
p = 'summe.ipynb' # relativer Pfad zu einer Datei
dirname, filename = os.path.split(p) # splitte Pfad in Verzeichnis und Datei
base, ext = os.path.splitext(filename) # splitte Datei in Basis und Erweiterung
print(dirname, filename, base, ext, sep=', ')
absdir = os.path.abspath(dirname) # wandle dirname zu absoluten Pfad um
absfile = os.path.join(absdir, base + '.py') # fügt mit Pfadtrenner zusammen
print(absfile)
# %% Pfade als Objekt: pathlib
import pathlib
p = pathlib.Path('summe.ipynb') # relativer Pfad zu einer Datei
abs_p = p.absolute() # wandle p zu absoluten Pfad um (hier: irrelevant)
abs_py = abs_p.with_suffix('.py') # Dateinamenserweiterung tauschen
print(abs_py)
framework_dir = abs_p.parent.parent # gehe zweimal "hoch"
print(framework_dir) # (ginge auch relativ: PosixPath('..'))
prod_ex = framework_dir / 'funktionen' / 'prod.py' # füge mit Pfadtrenner an
print(prod_ex)
file_content = prod_ex.read_text() # Datei einlesen
prod_ex.with_name('prod_copy.py').write_text(file_content) # Datei schreiben
# %% Dateinamen finden mittels glob-Syntax
from glob import glob
files = glob('~/data-science-notebooks/*grundlagen/*-sol.ipynb')
print(files)
files = glob('~/data-science-notebooks/**/[g-h]*-sol.ipynb', recursive=True)
print(files)
paths = pathlib.Path('..').glob('**/[a-g]*.ipynb')
print(list(paths))
# %% Docstrings und Type Hinting
def nthroot(x: float, n: float = 2) -> float:
"""nth root of a number
Parameters
----------
x : float or int
Number to take the root from.
n : float or int, optional
Root parameter (the default is 2).
Returns
-------
float
The nth root.
"""
return x ** (1/n)
help(nthroot)
print(nthroot(3, 3))
print(nthroot('asd', 3)) # um hier den Fehler sehen zu können, sollte mypy als Paket und VS Code Erweiterung installiert sein
# %% Fehler werfen und behandeln
from pathlib import Path
def tabs_to_spaces(filename):
if '*' in filename:
raise InvalidFileName(f'Filenames with * are not allowed: {filename}') # message if not caught
# raise ValueError(f'Filenames with * are not allowed: {filename}') # message if not caught
p = Path(filename)
file_contents = p.read_text().replace('\t', ' ')
p.write_text(file_contents)
class InvalidFileName(Exception):
pass
filenames = ['data.csv', 'does-not-exist', '*.csv']
for filename in filenames:
try:
tabs_to_spaces(filename)
except FileNotFoundError as e:
print(f'File {filename} not found, so also not converted to spaces.')
# except ValueError as e:
except InvalidFileName as e:
print(f'Use proper filenames, not glob syntax. Resolve {filename} before using glob.glob.')
except PermissionError as e: # e enthält die Fehlernachricht als str(e)
print(e, 'Could not convert to spaces.', sep='. ')
# %% Traceback
def fun():
with open('does-not-exist') as f:
f.read()
fun() # FileNotFoundError
# %% MyComplex
class MyComplex:
def __init__(self, re=0, im=0): # Konstruktor mit zwei "echten" Argumenten
self.re = re
self.im = im
def conjugate(self): # Methode ohne "echte" Argumente
return MyComplex(self.re, -self.im)
def __repr__(self): # wird über repr(z) (und ggf. über str(z)) aufgerufen
return f'MyComplex({self.re}, {self.im})'
def __str__(self): # wird über str(z) aufgerufen
return f'({self.re}{self.im:+}j)'
z1 = MyComplex(3, 4)
z2 = z1.conjugate()
print(f'z1: ({z1.re}, {z1.im})')
print(f'z2: ({z2.re}, {z2.im})')
print(repr(z1))
print(z1) # ruft intern str(z) auf, das als Fallback repr(z) aufrufen würde
# %% Kapselung
class A:
def __bar(self):
print('...not really private...')
a = A()
# a.__bar() # So geht es zwar nicht...
a._A__bar() # aber so
class B:
def _foo(self):
print('foo!')
b = B()
b._foo()
# %% Getter und Setter mit Decorator property
class MyPositiveNumber:
def __init__(self, r=0):
self.r = r
num = MyPositiveNumber(3)
num.r = -8 # schreiben
print(num.r) # lesen, ergibt -8
class MyPositiveNumber:
def __init__(self, r=0):
self.r = r # benutzt schon setter unten
@property # getter
def r(self):
return self._r
@r.setter # setter
def r(self, val):
self._r = val if val > 0 else 0
num = MyPositiveNumber(3)
num.r = -8 # ruft setter auf
print(num.r) # ruft getter auf, ergibt: 0
# %% Vererbung
class MyPositiveComplex(MyPositiveNumber): # erbt von MyPositiveNumber
def __init__(self, r=0, i=0):
super().__init__(r) # rufe Konstruktor von MyPositiveNumber auf
self.i = i # benutzt schon setter unten
@property # getter
def i(self):
return self._i
@i.setter # setter
def i(self, val):
self._i = val if val > 0 else 0
c = MyPositiveComplex(-8, 1)
c.i = -5 # ruft setter auf
print(f'{c.r} + {c.i}j') # ruft getter auf, ergibt: 0 + 0j
# %% Alternativer Konstruktor mit Klassenmethode
class Text:
def __init__(self, text):
self.text = text
@classmethod
def from_file(cls, path):
with open(path) as f:
return cls(f.read())
class GradedText(Text):
def __init__(self, text, grade=None):
super().__init__(text)
self.grade = grade
file = 'data.csv'
t = Text.from_file(file)
print(t.text)
print(type(t))
gt = GradedText.from_file(file)
print(gt.text, gt.grade)
print(type(gt))
'''This is my example module'''
__version__ = '1.3.4'
print('Hello Module')
def say_hello(name):
print('Hello', name)
\ No newline at end of file
from mypackage.mymod import say_hello
print('Hello Module')
def say_hello(name):
print('Hello', name)
\ No newline at end of file
def say_bye():
print('bye')
This diff is collapsed.
%% Cell type:markdown id: tags:
# Code zu Folien
Dieses Skript bzw. Jupyter-Notebook enthält den Code, der auch auf den Folien "NumPy & Matplotlib" enthalten ist. Zum Vorbereiten, Mitmachen oder Nacharbeiten.
%% Cell type:code id: tags:
```
import numpy as np
v = np.array([1, 3, 5])
print(v)
print(v.shape, v.dtype)
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape, a.dtype)
```
%% Cell type:code id: tags:
```
a = np.array([[[1]], [[3]], [[5]]])
print(a.shape)
a = np.array([[[1], [3], [5]]])
print(a.shape)
a = np.array([[[1, 3, 5]]])
print(a.shape)
```
%% Cell type:code id: tags:
```
v = np.arange(6) # shape: (6,) Vektor
a = v.reshape(-1, 3) # shape: (2, 3) Matrix
b = v.reshape(1, -1) # shape: (1, 6) Matrix
# x = v.reshape(4, -1) # shape: (4, ?) Matrix (passt nicht)
c = a[np.newaxis, :, :] # shape: (1, 2, 3) 3D
d = a[np.newaxis, ...] # shape: (1, 2, 3) 3D
e = a[np.newaxis, :, np.newaxis, :] # shape: (1, 2, 1, 3) 4D
f = e.squeeze() # shape: (2, 3) Matrix. Was ergäbe e.ravel()?
print(v.shape)
print(a.shape)
print(b.shape)
print(c.shape)
print(d.shape)
print(e.shape)
print(f.shape)
```
%% Cell type:code id: tags:
```
rng = np.random.default_rng() # random number generator
np.zeros((1, 5), dtype=bool) # 1 x 5-Matrix mit False
np.zeros_like(a) # Array mit 0en mit Shape und Typ von a
np.ones((1, 3)) # 1 x 3-Matrix mit 1en
rng.uniform(size=(2, 4)) # 2 x 4-Matrix mit uniformen Zufallszahlen aus [0, 1)
rng.integers(0, 10, (2, 4)) # 2 x 4-Matrix mit Zufallszahlen von 0 bis 9
rng.choice(10, size=4, replace=False) # Vektor mit 4 eindeutigen Elem. aus {0, ..., 9}
rng.permutation(10) # {0, ..., 9}, aber in zufälliger Reihenfolge
np.arange(-1, 0.05, 0.1) # Vektor von -1 bis 1 mit Schrittweite 0.1
np.linspace(-1, 1, 9) # Vektor mit 9 Werten lin. zwischen -1 und 1
np.logspace(-1, 1, 9) # Vektor mit 9 Werten log. zwischen 10^-1 und 10^1
```
%% Cell type:code id: tags:
```
a = np.array([[1, 2, 3], [4, 5, 6]])
v = np.array([10, 20, 30])
b = np.ones((3, 3))
print('np.sin(a):')
print(np.sin(a))
print('np.mean(a), np.std(a), np.max(a), np.min(a):')
print(np.mean(a), np.std(a), np.max(a), np.min(a))
print('np.sum(a), np.sum(a, axis=0), np.sum(a, axis=1):')
print(np.sum(a), np.sum(a, axis=0), np.sum(a, axis=1))
print('a**2:')
print(a**2)
print('a.T:')
print(a.T)
print('a @ v:')
print(a @ v)
print('a @ b:')
print(a @ b)
print('a.reshape(6):')
print(a.reshape(6))
print('np.delete(a, 1, axis=0):')
print(np.delete(a, 1, axis=0))
print('np.sort(a):')
print(np.sort(a))
print('np.argsort(a):')
print(np.argsort(a))
```
%% Cell type:code id: tags:
```
v = np.array([0, 1, 2, 3, 4, 5, 6])
print(v[1:5]) # Elemente 1 (inkl.) bis 5 (exkl.)
print(v[1:5:2]) # Elemente 1 bis 5 mit Schrittweite 2
print(v[::2]) # Alle Elemente mit Schrittweite 2
print(v[-3:]) # Die 3 letzten Elemente
print(v[::-1]) # Reihenfolge umkehren
```
%% Cell type:code id: tags:
```
a = np.array([[1,2,3], [4,5,6]])
print(a[1, 2]) # Element a_{1,2}
print(a[1]) # Zeile 1
print(a[1, 1:]) # Zeile 1, ab Spalte 1
print(a[:, -1]) # letzte Spalte
print(a[0, ::-1]) # Zeile 0, Spalten umkehren
```
%% Cell type:code id: tags:
```
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a[0, ::-1] # a und b zeigen auf die gleichen Daten.
b[0] = 0 # Eine Änderung in b ...
print(a) # ... wirkt sich auch auf a aus.
c = a.copy()
print(np.shares_memory(a, b))
print(np.shares_memory(a, c))
```
%% Cell type:code id: tags:
```
v = np.array([4, 8, 15, 16, 23, 42])
print(v[[1, 4, 2]]) # Die Elemente bei 1, 4 und 2 als neues np-Array
print(v[np.array([[1, 4],
[1, 2]])])
```
%% Cell type:code id: tags:
```
A = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# Die Indizes werden paarweise genommen: [1, 1] und [2, 3]
print(A[[1, 2],
[1, 3]])
# Zeilen 1 und 2, Spalten 1 und 3)
print(A[np.ix_([1, 2], [1, 3])])
```
%% Cell type:code id: tags:
```
a = np.array([[1, 2, 3], [4, 5, 6]])
i = a > 4
print(i)
print(a[i])
a[~i] += 10 # ~ invertiert die Boolesche Matrix
print(a)
```
%% Cell type:code id: tags:
```
idx2d = np.nonzero(i) # Trues bei Zeile 1, Spalte 1 und bei Zeile 1, Spalte 2
print(idx2d)
print(a[idx2d])
idx1d = np.flatnonzero(i) # Trues bei Einzelindex 4 und bei Einzelindex 5
print(idx1d)
print(a.flat[idx1d])
```
%% Cell type:code id: tags:
```
data = np.random.default_rng().random(100) # uniform verteilt in [0, 1)
print(np.sum(data > 0.5))
print(np.count_nonzero(data > 0.5))
print(len(data[data > 0.5]))
print(np.nonzero(data > 0.5)[0].size) # [0] weil mit Tupel umhüllt
print(np.flatnonzero(data > 0.5).size) # size ist Produkt über #*shape*
```
%% Cell type:code id: tags:
```
A = np.array([[0, 1],
[2, 3],
[4, 5]])
B = np.array([[5],
[7],
[9]])
C = np.array([[8, 7],
[9, 6]])
V = np.vstack((A, C))
print(V)
H = np.hstack((A, B, B))
print(H)
```
%% Cell type:code id: tags:
```
data = np.loadtxt('autos.csv', delimiter=',', skiprows=1, usecols=range(2,9))
print(data)
print(data.shape)
# usecols als Zahlen oder Namen (z. B. 'Hubraum') möglich!
sa = np.genfromtxt('autos.csv', delimiter=',', names=True, dtype=float)
data = sa.view((float, len(sa.dtype.names)))
print(data)
print(data.shape)
structdata = np.genfromtxt('autos.csv', delimiter=',', names=True, dtype=None, encoding='utf-8')
print(structdata)
print(structdata.shape)
```
%% Cell type:code id: tags:
```
x = np.arange(0, 10, 0.2)
y1 = np.sin(x); y2 = np.cos(x)
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # neues Fenster mit Achsen
ax.plot(x, y1, label='Sin') # sin Plot hinzufügen
ax.plot(x, y2, label='Cos') # cos Plot hinzufügen
ax.set_title('Simple Plot')
ax.set_xlabel('x-Achse')
ax.set_ylabel('y-Achse')
ax.grid()
plt.legend()
fig.savefig('plot.pdf', bbox_inches='tight') # ggf. Plot speichern (pdf, png, ...)
plt.show() # anzeigen (bei non-interactive)
```
%% Cell type:code id: tags:
```
rng = np.random.default_rng()
x = rng.random(100)
y = 5 * x**2 + rng.random(100)
plt.figure() # neues Fenster (optional)
plt.scatter(x, y, s=100*y, c=x, alpha=0.4)
fig = plt.gcf()
ax = plt.gca()
```
%% Cell type:code id: tags:
```
from numpy.polynomial import Polynomial
x = np.arange(10)
y = 2 * x
# y = x ** 2
p = Polynomial.fit(x, y, deg=1).convert()
print(p(1))
print(p(np.array([1., 3., 5.])))
print(p.coef) # Koeffizienten
plt.plot(x, p(x)) # Plot oben
plt.scatter(x, y, color='r')
```
%% Cell type:code id: tags:
```
from sklearn.linear_model import LinearRegression
x = np.arange(10).reshape(-1, 1)
y = x ** 2
linreg = LinearRegression()
linreg.fit(x, y)
print(linreg.predict([[1]]))
print(linreg.predict([[1], [3], [5]]))
print(linreg.intercept_, linreg.coef_)
```
%% Cell type:code id: tags:
```
x = np.arange(10).reshape(-1, 1)
y = x ** 2
x_poly = np.hstack((x, x**2)) # shape: 10 x 2
linreg = LinearRegression()
linreg.fit(x_poly, y)
print(linreg.predict([[3, 9]]))
print(linreg.intercept_, linreg.coef_)
```
%% Cell type:code id: tags:
```
rng = np.random.default_rng()
x = rng.uniform(size=(100, 1)) * 3 - 0.5
y = np.round(x % 1) - 0.5
def fourier_basis(x, n=4):
return np.hstack([np.sin(2 * np.pi * k * x) for k in range(1, 2 * n, 2)])
x_f = fourier_basis(x, 5)
linreg = LinearRegression()
linreg.fit(x_f, y)
x_plt = np.linspace(0, 4, 501).reshape(-1, 1)
x_plt_f = fourier_basis(x_plt, 5)
y_plt = linreg.predict(x_plt_f)
plt.plot(x_plt, y_plt)
plt.scatter(x, y, color='r')
```
# %% [markdown]
# # Code zu Folien
#
# Dieses Skript bzw. Jupyter-Notebook enthält den Code, der auch auf den Folien "NumPy & Matplotlib" enthalten ist. Zum Vorbereiten, Mitmachen oder Nacharbeiten.
# %% 1D und 2D Arrays
import numpy as np
v = np.array([1, 3, 5])
print(v)
print(v.shape, v.dtype)
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape, a.dtype)
# %% 3D Arrays
a = np.array([[[1]], [[3]], [[5]]])
print(a.shape)
a = np.array([[[1], [3], [5]]])
print(a.shape)
a = np.array([[[1, 3, 5]]])
print(a.shape)
# %% Shape
v = np.arange(6) # shape: (6,) Vektor
a = v.reshape(-1, 3) # shape: (2, 3) Matrix
b = v.reshape(1, -1) # shape: (1, 6) Matrix
# x = v.reshape(4, -1) # shape: (4, ?) Matrix (passt nicht)
c = a[np.newaxis, :, :] # shape: (1, 2, 3) 3D
d = a[np.newaxis, ...] # shape: (1, 2, 3) 3D
e = a[np.newaxis, :, np.newaxis, :] # shape: (1, 2, 1, 3) 4D
f = e.squeeze() # shape: (2, 3) Matrix. Was ergäbe e.ravel()?
print(v.shape)
print(a.shape)
print(b.shape)
print(c.shape)
print(d.shape)
print(e.shape)
print(f.shape)
# %% Erzeugendenfunktionen
rng = np.random.default_rng() # random number generator
np.zeros((1, 5), dtype=bool) # 1 x 5-Matrix mit False
np.zeros_like(a) # Array mit 0en mit Shape und Typ von a
np.ones((1, 3)) # 1 x 3-Matrix mit 1en
rng.uniform(size=(2, 4)) # 2 x 4-Matrix mit uniformen Zufallszahlen aus [0, 1)
rng.integers(0, 10, (2, 4)) # 2 x 4-Matrix mit Zufallszahlen von 0 bis 9
rng.choice(10, size=4, replace=False) # Vektor mit 4 eindeutigen Elem. aus {0, ..., 9}
rng.permutation(10) # {0, ..., 9}, aber in zufälliger Reihenfolge
np.arange(-1, 0.05, 0.1) # Vektor von -1 bis 1 mit Schrittweite 0.1
np.linspace(-1, 1, 9) # Vektor mit 9 Werten lin. zwischen -1 und 1
np.logspace(-1, 1, 9) # Vektor mit 9 Werten log. zwischen 10^-1 und 10^1
# %% Rechnen
a = np.array([[1, 2, 3], [4, 5, 6]])
v = np.array([10, 20, 30])
b = np.ones((3, 3))
print('np.sin(a):')
print(np.sin(a))
print('np.mean(a), np.std(a), np.max(a), np.min(a):')
print(np.mean(a), np.std(a), np.max(a), np.min(a))
print('np.sum(a), np.sum(a, axis=0), np.sum(a, axis=1):')
print(np.sum(a), np.sum(a, axis=0), np.sum(a, axis=1))
print('a**2:')
print(a**2)
print('a.T:')
print(a.T)
print('a @ v:')
print(a @ v)
print('a @ b:')
print(a @ b)
print('a.reshape(6):')
print(a.reshape(6))
print('np.delete(a, 1, axis=0):')
print(np.delete(a, 1, axis=0))
print('np.sort(a):')
print(np.sort(a))
print('np.argsort(a):')
print(np.argsort(a))
# %% Indizierung & Slicing: v
v = np.array([0, 1, 2, 3, 4, 5, 6])
print(v[1:5]) # Elemente 1 (inkl.) bis 5 (exkl.)
print(v[1:5:2]) # Elemente 1 bis 5 mit Schrittweite 2
print(v[::2]) # Alle Elemente mit Schrittweite 2
print(v[-3:]) # Die 3 letzten Elemente
print(v[::-1]) # Reihenfolge umkehren
# %% Indizierung & Slicing: a
a = np.array([[1,2,3], [4,5,6]])
print(a[1, 2]) # Element a_{1,2}
print(a[1]) # Zeile 1
print(a[1, 1:]) # Zeile 1, ab Spalte 1
print(a[:, -1]) # letzte Spalte
print(a[0, ::-1]) # Zeile 0, Spalten umkehren
# %% View
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a[0, ::-1] # a und b zeigen auf die gleichen Daten.
b[0] = 0 # Eine Änderung in b ...
print(a) # ... wirkt sich auch auf a aus.
c = a.copy()
print(np.shares_memory(a, b))
print(np.shares_memory(a, c))
# %% Komplexe Indizierung
v = np.array([4, 8, 15, 16, 23, 42])
print(v[[1, 4, 2]]) # Die Elemente bei 1, 4 und 2 als neues np-Array
print(v[np.array([[1, 4],
[1, 2]])])
# %% Komplexe Indizierung in 2D
A = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# Die Indizes werden paarweise genommen: [1, 1] und [2, 3]
print(A[[1, 2],
[1, 3]])
# Zeilen 1 und 2, Spalten 1 und 3)
print(A[np.ix_([1, 2], [1, 3])])
# %% Boolesche Indizierung
a = np.array([[1, 2, 3], [4, 5, 6]])
i = a > 4
print(i)
print(a[i])
a[~i] += 10 # ~ invertiert die Boolesche Matrix
print(a)
# %% Boolescher Index zu komplexen Index
idx2d = np.nonzero(i) # Trues bei Zeile 1, Spalte 1 und bei Zeile 1, Spalte 2
print(idx2d)
print(a[idx2d])
idx1d = np.flatnonzero(i) # Trues bei Einzelindex 4 und bei Einzelindex 5
print(idx1d)
print(a.flat[idx1d])
# %% Beispiel: Boolesches Array
data = np.random.default_rng().random(100) # uniform verteilt in [0, 1)
print(np.sum(data > 0.5))
print(np.count_nonzero(data > 0.5))
print(len(data[data > 0.5]))
print(np.nonzero(data > 0.5)[0].size) # [0] weil mit Tupel umhüllt
print(np.flatnonzero(data > 0.5).size) # size ist Produkt über #*shape*
# %% Arrays verbinden
A = np.array([[0, 1],
[2, 3],
[4, 5]])
B = np.array([[5],
[7],
[9]])
C = np.array([[8, 7],
[9, 6]])
V = np.vstack((A, C))
print(V)
H = np.hstack((A, B, B))
print(H)
# %% CSV-Import
data = np.loadtxt('autos.csv', delimiter=',', skiprows=1, usecols=range(2,9))
print(data)
print(data.shape)
# usecols als Zahlen oder Namen (z. B. 'Hubraum') möglich!
sa = np.genfromtxt('autos.csv', delimiter=',', names=True, dtype=float)
data = sa.view((float, len(sa.dtype.names)))
print(data)
print(data.shape)
structdata = np.genfromtxt('autos.csv', delimiter=',', names=True, dtype=None, encoding='utf-8')
print(structdata)
print(structdata.shape)
# %% Linienplot
x = np.arange(0, 10, 0.2)
y1 = np.sin(x); y2 = np.cos(x)
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # neues Fenster mit Achsen
ax.plot(x, y1, label='Sin') # sin Plot hinzufügen
ax.plot(x, y2, label='Cos') # cos Plot hinzufügen
ax.set_title('Simple Plot')
ax.set_xlabel('x-Achse')
ax.set_ylabel('y-Achse')
ax.grid()
plt.legend()
fig.savefig('plot.pdf', bbox_inches='tight') # ggf. Plot speichern (pdf, png, ...)
plt.show() # anzeigen (bei non-interactive)
# %% Scatter Plot
rng = np.random.default_rng()
x = rng.random(100)
y = 5 * x**2 + rng.random(100)
plt.figure() # neues Fenster (optional)
plt.scatter(x, y, s=100*y, c=x, alpha=0.4)
fig = plt.gcf()
ax = plt.gca()
# %% Lineare Regression mit NumPy
from numpy.polynomial import Polynomial
x = np.arange(10)
y = 2 * x
# y = x ** 2
p = Polynomial.fit(x, y, deg=1).convert()
print(p(1))
print(p(np.array([1., 3., 5.])))
print(p.coef) # Koeffizienten
plt.plot(x, p(x)) # Plot oben
plt.scatter(x, y, color='r')
# %% Lineare Regression mit Scikit-Learn, Grad 1
from sklearn.linear_model import LinearRegression
x = np.arange(10).reshape(-1, 1)
y = x ** 2
linreg = LinearRegression()
linreg.fit(x, y)
print(linreg.predict([[1]]))
print(linreg.predict([[1], [3], [5]]))
print(linreg.intercept_, linreg.coef_)
# %% Lineare Regression mit Scikit-Learn, Grad 2
x = np.arange(10).reshape(-1, 1)
y = x ** 2
x_poly = np.hstack((x, x**2)) # shape: 10 x 2
linreg = LinearRegression()
linreg.fit(x_poly, y)
print(linreg.predict([[3, 9]]))
print(linreg.intercept_, linreg.coef_)
# %% Andere Basisfunktionen
rng = np.random.default_rng()
x = rng.uniform(size=(100, 1)) * 3 - 0.5
y = np.round(x % 1) - 0.5
def fourier_basis(x, n=4):
return np.hstack([np.sin(2 * np.pi * k * x) for k in range(1, 2 * n, 2)])
x_f = fourier_basis(x, 5)
linreg = LinearRegression()
linreg.fit(x_f, y)
x_plt = np.linspace(0, 4, 501).reshape(-1, 1)
x_plt_f = fourier_basis(x_plt, 5)
y_plt = linreg.predict(x_plt_f)
plt.plot(x_plt, y_plt)
plt.scatter(x, y, color='r')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment