3.2 Das Modul NumPy#

Python kann auch auf schwachbrüstiger Hardware laufen wie beispielsweise auf dem Raspberry Pi. Ein Grund für die Effizienz von Python ist, dass nicht alle möglichen Datentypen, Funktionen und Methoden von Beginn an in den Speicher geladen werden, sondern erst bei Bedarf. Python-Code ist in sogenannte Module unterteilt.

In diesem Jupyter Notebook werden wir den Modul-Mechanismus anhand des NumPy-Moduls kennenlernen.

Lernziele#

Lernziele

  • Sie können erklären, was ein Modul in Python ist.

  • Sie können ein Modul komplett mit import modul importieren und auf die darin enthaltenen Funktionalitäten mit modul.funktionalitaet zugreifen.

  • Sie können mit from modul import funktionalitaet einzelne Funktionalitäten eines Moduls importieren.

  • Sie kennen das Modul NumPy.

Importieren von Modulen#

Es wäre schön, häufig gebrauchte Zahlen wie die Kreiszahl \(\pi\) oder die Eulersche Zahl \(e\) zur Verfügung zu haben. Leider gehören beide nicht zum Python-Kern. Geben Sie einmal den folgenden Code ein:

print(pi)

Python gibt eine Fehlermeldung aus. Der Fehler lautet “NameError”. Der Python-Interpreter meldet auch, bei welcher Variable der Namensfehler auftritt, nämlich bei ‘pi’.

Die fehlende Kreiszahl Pi könnte natürlich zu Beginn eines Programmes eingeführt werden.

pi = 3.14
print(pi)
3.14

Aber es gibt ja noch mehr Funktionalitäten, die im Python-Kern fehlen wie beispielsweise die Sinus-Funktion oder die Wurzel-Funktion.

Module sind Python-Programme, die Konstanten oder Anweisungen (Funktionen, Klassen) zur Verfügung stellen und damit den eigentlichen Python-Kern erweitern. Module müssen importiert werden, damit der Python-Interpreter diese erweiterten Funktionalitäten benutzen kann.

Es gibt mehrere Anweisungen, ein Modul zu importieren. Als erstes betrachten wir die direkte import-Anweisung und importieren das Mathematik-Modul numpy. Das NumPy-Modul ist eine leistungsstarke Bibliothek für numerische Berechnungen in Python, die häufig in wissenschaftlichen und technischen Anwendungen verwendet wird.

import numpy

Wird die obige Anweisung import numpy ausgeführt, passiert scheinbar nichts. Tatsächlich hat der Python-Interpreter jedoch das Modul geladen. Die Anweisung dir(numpy) listet auf, was genau alles importiert wurde.

dir(numpy)
['ALLOW_THREADS',
 'AxisError',
 'BUFSIZE',
 'CLIP',
 'ComplexWarning',
 'DataSource',
 'ERR_CALL',
 'ERR_DEFAULT',
 'ERR_IGNORE',
 'ERR_LOG',
 'ERR_PRINT',
 'ERR_RAISE',
 'ERR_WARN',
 'FLOATING_POINT_SUPPORT',
 'FPE_DIVIDEBYZERO',
 'FPE_INVALID',
 'FPE_OVERFLOW',
 'FPE_UNDERFLOW',
 'False_',
 'Inf',
 'Infinity',
 'MAXDIMS',
 'MAY_SHARE_BOUNDS',
 'MAY_SHARE_EXACT',
 'ModuleDeprecationWarning',
 'NAN',
 'NINF',
 'NZERO',
 'NaN',
 'PINF',
 'PZERO',
 'RAISE',
 'RankWarning',
 'SHIFT_DIVIDEBYZERO',
 'SHIFT_INVALID',
 'SHIFT_OVERFLOW',
 'SHIFT_UNDERFLOW',
 'ScalarType',
 'Tester',
 'TooHardError',
 'True_',
 'UFUNC_BUFSIZE_DEFAULT',
 'UFUNC_PYVALS_NAME',
 'VisibleDeprecationWarning',
 'WRAP',
 '_CopyMode',
 '_NoValue',
 '_UFUNC_API',
 '__NUMPY_SETUP__',
 '__all__',
 '__builtins__',
 '__cached__',
 '__config__',
 '__deprecated_attrs__',
 '__dir__',
 '__doc__',
 '__expired_functions__',
 '__file__',
 '__former_attrs__',
 '__future_scalars__',
 '__getattr__',
 '__git_version__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '__version__',
 '_add_newdoc_ufunc',
 '_builtins',
 '_distributor_init',
 '_financial_names',
 '_get_promotion_state',
 '_globals',
 '_int_extended_msg',
 '_mat',
 '_no_nep50_warning',
 '_pyinstaller_hooks_dir',
 '_pytesttester',
 '_set_promotion_state',
 '_specific_msg',
 '_version',
 'abs',
 'absolute',
 'add',
 'add_docstring',
 'add_newdoc',
 'add_newdoc_ufunc',
 'all',
 'allclose',
 'alltrue',
 'amax',
 'amin',
 'angle',
 'any',
 'append',
 'apply_along_axis',
 'apply_over_axes',
 'arange',
 'arccos',
 'arccosh',
 'arcsin',
 'arcsinh',
 'arctan',
 'arctan2',
 'arctanh',
 'argmax',
 'argmin',
 'argpartition',
 'argsort',
 'argwhere',
 'around',
 'array',
 'array2string',
 'array_equal',
 'array_equiv',
 'array_repr',
 'array_split',
 'array_str',
 'asanyarray',
 'asarray',
 'asarray_chkfinite',
 'ascontiguousarray',
 'asfarray',
 'asfortranarray',
 'asmatrix',
 'atleast_1d',
 'atleast_2d',
 'atleast_3d',
 'average',
 'bartlett',
 'base_repr',
 'binary_repr',
 'bincount',
 'bitwise_and',
 'bitwise_not',
 'bitwise_or',
 'bitwise_xor',
 'blackman',
 'block',
 'bmat',
 'bool_',
 'broadcast',
 'broadcast_arrays',
 'broadcast_shapes',
 'broadcast_to',
 'busday_count',
 'busday_offset',
 'busdaycalendar',
 'byte',
 'byte_bounds',
 'bytes_',
 'c_',
 'can_cast',
 'cast',
 'cbrt',
 'cdouble',
 'ceil',
 'cfloat',
 'char',
 'character',
 'chararray',
 'choose',
 'clip',
 'clongdouble',
 'clongfloat',
 'column_stack',
 'common_type',
 'compare_chararrays',
 'compat',
 'complex128',
 'complex64',
 'complex_',
 'complexfloating',
 'compress',
 'concatenate',
 'conj',
 'conjugate',
 'convolve',
 'copy',
 'copysign',
 'copyto',
 'corrcoef',
 'correlate',
 'cos',
 'cosh',
 'count_nonzero',
 'cov',
 'cross',
 'csingle',
 'ctypeslib',
 'cumprod',
 'cumproduct',
 'cumsum',
 'datetime64',
 'datetime_as_string',
 'datetime_data',
 'deg2rad',
 'degrees',
 'delete',
 'deprecate',
 'deprecate_with_doc',
 'diag',
 'diag_indices',
 'diag_indices_from',
 'diagflat',
 'diagonal',
 'diff',
 'digitize',
 'disp',
 'divide',
 'divmod',
 'dot',
 'double',
 'dsplit',
 'dstack',
 'dtype',
 'e',
 'ediff1d',
 'einsum',
 'einsum_path',
 'emath',
 'empty',
 'empty_like',
 'equal',
 'error_message',
 'errstate',
 'euler_gamma',
 'exp',
 'exp2',
 'expand_dims',
 'expm1',
 'extract',
 'eye',
 'fabs',
 'fastCopyAndTranspose',
 'fft',
 'fill_diagonal',
 'find_common_type',
 'finfo',
 'fix',
 'flatiter',
 'flatnonzero',
 'flexible',
 'flip',
 'fliplr',
 'flipud',
 'float16',
 'float32',
 'float64',
 'float_',
 'float_power',
 'floating',
 'floor',
 'floor_divide',
 'fmax',
 'fmin',
 'fmod',
 'format_float_positional',
 'format_float_scientific',
 'format_parser',
 'frexp',
 'from_dlpack',
 'frombuffer',
 'fromfile',
 'fromfunction',
 'fromiter',
 'frompyfunc',
 'fromregex',
 'fromstring',
 'full',
 'full_like',
 'gcd',
 'generic',
 'genfromtxt',
 'geomspace',
 'get_array_wrap',
 'get_include',
 'get_printoptions',
 'getbufsize',
 'geterr',
 'geterrcall',
 'geterrobj',
 'gradient',
 'greater',
 'greater_equal',
 'half',
 'hamming',
 'hanning',
 'heaviside',
 'histogram',
 'histogram2d',
 'histogram_bin_edges',
 'histogramdd',
 'hsplit',
 'hstack',
 'hypot',
 'i0',
 'identity',
 'iinfo',
 'imag',
 'in1d',
 'index_exp',
 'indices',
 'inexact',
 'inf',
 'info',
 'infty',
 'inner',
 'insert',
 'int16',
 'int32',
 'int64',
 'int8',
 'int_',
 'intc',
 'integer',
 'interp',
 'intersect1d',
 'intp',
 'invert',
 'is_busday',
 'isclose',
 'iscomplex',
 'iscomplexobj',
 'isfinite',
 'isfortran',
 'isin',
 'isinf',
 'isnan',
 'isnat',
 'isneginf',
 'isposinf',
 'isreal',
 'isrealobj',
 'isscalar',
 'issctype',
 'issubclass_',
 'issubdtype',
 'issubsctype',
 'iterable',
 'ix_',
 'kaiser',
 'kron',
 'lcm',
 'ldexp',
 'left_shift',
 'less',
 'less_equal',
 'lexsort',
 'lib',
 'linalg',
 'linspace',
 'little_endian',
 'load',
 'loadtxt',
 'log',
 'log10',
 'log1p',
 'log2',
 'logaddexp',
 'logaddexp2',
 'logical_and',
 'logical_not',
 'logical_or',
 'logical_xor',
 'logspace',
 'longcomplex',
 'longdouble',
 'longfloat',
 'longlong',
 'lookfor',
 'ma',
 'mask_indices',
 'mat',
 'math',
 'matmul',
 'matrix',
 'max',
 'maximum',
 'maximum_sctype',
 'may_share_memory',
 'mean',
 'median',
 'memmap',
 'meshgrid',
 'mgrid',
 'min',
 'min_scalar_type',
 'minimum',
 'mintypecode',
 'mod',
 'modf',
 'moveaxis',
 'msort',
 'multiply',
 'nan',
 'nan_to_num',
 'nanargmax',
 'nanargmin',
 'nancumprod',
 'nancumsum',
 'nanmax',
 'nanmean',
 'nanmedian',
 'nanmin',
 'nanpercentile',
 'nanprod',
 'nanquantile',
 'nanstd',
 'nansum',
 'nanvar',
 'nbytes',
 'ndarray',
 'ndenumerate',
 'ndim',
 'ndindex',
 'nditer',
 'negative',
 'nested_iters',
 'newaxis',
 'nextafter',
 'nonzero',
 'not_equal',
 'numarray',
 'number',
 'obj2sctype',
 'object_',
 'ogrid',
 'oldnumeric',
 'ones',
 'ones_like',
 'outer',
 'packbits',
 'pad',
 'partition',
 'percentile',
 'pi',
 'piecewise',
 'place',
 'poly',
 'poly1d',
 'polyadd',
 'polyder',
 'polydiv',
 'polyfit',
 'polyint',
 'polymul',
 'polynomial',
 'polysub',
 'polyval',
 'positive',
 'power',
 'printoptions',
 'prod',
 'product',
 'promote_types',
 'ptp',
 'put',
 'put_along_axis',
 'putmask',
 'quantile',
 'r_',
 'rad2deg',
 'radians',
 'random',
 'ravel',
 'ravel_multi_index',
 'real',
 'real_if_close',
 'rec',
 'recarray',
 'recfromcsv',
 'recfromtxt',
 'reciprocal',
 'record',
 'remainder',
 'repeat',
 'require',
 'reshape',
 'resize',
 'result_type',
 'right_shift',
 'rint',
 'roll',
 'rollaxis',
 'roots',
 'rot90',
 'round',
 'round_',
 'row_stack',
 's_',
 'safe_eval',
 'save',
 'savetxt',
 'savez',
 'savez_compressed',
 'sctype2char',
 'sctypeDict',
 'sctypes',
 'searchsorted',
 'select',
 'set_numeric_ops',
 'set_printoptions',
 'set_string_function',
 'setbufsize',
 'setdiff1d',
 'seterr',
 'seterrcall',
 'seterrobj',
 'setxor1d',
 'shape',
 'shares_memory',
 'short',
 'show_config',
 'show_runtime',
 'sign',
 'signbit',
 'signedinteger',
 'sin',
 'sinc',
 'single',
 'singlecomplex',
 'sinh',
 'size',
 'sometrue',
 'sort',
 'sort_complex',
 'source',
 'spacing',
 'split',
 'sqrt',
 'square',
 'squeeze',
 'stack',
 'std',
 'str_',
 'string_',
 'subtract',
 'sum',
 'swapaxes',
 'take',
 'take_along_axis',
 'tan',
 'tanh',
 'tensordot',
 'test',
 'testing',
 'tile',
 'timedelta64',
 'trace',
 'tracemalloc_domain',
 'transpose',
 'trapz',
 'tri',
 'tril',
 'tril_indices',
 'tril_indices_from',
 'trim_zeros',
 'triu',
 'triu_indices',
 'triu_indices_from',
 'true_divide',
 'trunc',
 'typecodes',
 'typename',
 'ubyte',
 'ufunc',
 'uint',
 'uint16',
 'uint32',
 'uint64',
 'uint8',
 'uintc',
 'uintp',
 'ulonglong',
 'unicode_',
 'union1d',
 'unique',
 'unpackbits',
 'unravel_index',
 'unsignedinteger',
 'unwrap',
 'use_hugepage',
 'ushort',
 'vander',
 'var',
 'vdot',
 'vectorize',
 'version',
 'void',
 'vsplit',
 'vstack',
 'w',
 'where',
 'who',
 'zeros',
 'zeros_like']

Offensichtlich gehören sehr viele mathematische Funktionen zum NumPy-Modul, aber auch die beiden Zahlen pi und e finden wir in der Liste. Dann können wir ja \(\pi\) jetzt direkt ausgeben lassen:

print(pi)
3.14

Erstaunlich, dass in einem Standard-Modul von Python die Programmier:innen \(\pi\) nur mit zwei Nachkommastellen angegeben haben… haben sie auch nicht. Die Variable pi wurde von uns selbst mit pi = 3.14 definiert und ist nicht identisch mit pi aus dem NumPy-Modul. Die Kreiszahl aus dem NumPy-Modul heißt nämlich numpy.pi.

print(numpy.pi)
3.141592653589793

Um Konstanten, Datentypen oder Funktionen eines Moduls zu nutzen, wird der Modulname vorangestellt und erneut der Punkt benutzt. Probieren Sie es in der nächsten Mini-Übung aus.

Mini-Übung

Weisen Sie der Variablen x den Wert \(\pi\) zu. Lassen Sie dann \(y = \sin(x)\) berechnen und ausgeben.

# Hier Ihr Code

Lösung

x = numpy.pi
y = numpy.sin(x)

print(y)

Importieren von einzelnen Funktionen oder Klassen#

Wenn nur die Kreiszahl \(\pi\) gebraucht wird, ist der komplette Import des NumPy-Modules zuviel des Guten. Auch kann es lästig sein, immer numpy. vor pi zu setzen. Eine zweite Möglichkeit, Funktionalitäten eines Moduls zu importieren, ist die Alternative

from modulname import etwas1, etwas2

\(\pi\) und die Sinus-Funktion werden dann folgendermaßen importiert:

from numpy import pi, sin

Jetzt können pi und sin direkt benutzt werden, ohne numpy. davor zu schreiben.

print(pi)
print(sin(0))
3.141592653589793
0.0

Mini-Übung

Importieren Sie die Wurzel-Funktion sqrt() direkt aus NumPy. Berechnen Sie dann \(\sqrt{49}\) und \(\sqrt{2}\) und lassen Sie das Ergebnis jeweils ausgeben.

# Hier Ihr Code

Lösung

from numpy import sqrt

print(sqrt(49))
print(sqrt(2))

Importieren von Modulen mit Alias#

Es ist üblich, Module mit einem kürzeren Alias zu importieren, um den Code lesbarer zu gestalten und weniger tippen zu müssen. Im Fall von NumPy wird häufig der Alias np verwendet:

import numpy as np

Nachdem wir das Modul mit einem Alias importiert haben, verwenden wir diesen Alias, um auf die Funktionen und Klassen des Moduls zuzugreifen:

x = np.pi
print(x)
3.141592653589793

Mini-Übung

Importieren Sie das math-Modul mit dem Alias m und lassen Sie die Kreiszahl \(\pi\) ausgeben. Bilden Sie dann die Differenz aus der Kreiszahl des math-Moduls und der Kreiszahl des NumPy-Moduls.

Gibt es einen Unterschied zwischen den beiden Zahlen?

# Hier Ihr Code

Lösung

import math as m

print(m.pi)

differenz = m.pi - np.pi
print(differenz)

Das math-Modul stellt ebenfalls mathematische Konstanten und Funktionen zur Verfügung, ist aber weniger umfangreich. Daher verwenden wir in dieser Vorlesung NumPy.

Zusammenfassung#

In diesem Kapitel haben wir den Modul-Mechanismus in Python untersucht und das NumPy-Modul als Beispiel verwendet. Wir haben gelernt, wie man Module importiert, spezifische Funktionen und Klassen aus einem Modul importiert und Module mit einem Alias importiert. Durch das Verständnis dieser Konzepte können Sie Ihren Python-Code besser organisieren und die Wiederverwendbarkeit von Code verbessern.