Rheinwerk Computing < openbook >

 
Inhaltsverzeichnis
1 Einleitung
2 Die Programmiersprache Python
Teil I Einstieg in Python
3 Erste Schritte im interaktiven Modus
4 Der Weg zum ersten Programm
5 Kontrollstrukturen
6 Dateien
7 Das Laufzeitmodell
8 Funktionen, Methoden und Attribute
9 Informationsquellen zu Python
Teil II Datentypen
10 Das Nichts – NoneType
11 Operatoren
12 Numerische Datentypen
13 Sequenzielle Datentypen
14 Zuordnungen
15 Mengen
16 Collections
17 Datum und Zeit
18 Aufzählungstypen – Enum
Teil III Fortgeschrittene Programmiertechniken
19 Funktionen
20 Modularisierung
21 Objektorientierung
22 Ausnahmebehandlung
23 Iteratoren
24 Kontextobjekte
25 Manipulation von Funktionen und Methoden
Teil IV Die Standardbibliothek
26 Mathematik
27 Kryptografie
28 Reguläre Ausdrücke
29 Schnittstelle zu Betriebssystem und Laufzeitumgebung
30 Kommandozeilenparameter
31 Dateisystem
32 Parallele Programmierung
33 Datenspeicherung
34 Netzwerkkommunikation
35 Debugging und Qualitätssicherung
36 Dokumentation
Teil V Weiterführende Themen
37 Anbindung an andere Programmiersprachen
38 Distribution von Python-Projekten
39 Grafische Benutzeroberflächen
40 Python als serverseitige Programmiersprache im WWW – ein Einstieg in Django
41 Wissenschaftliches Rechnen
42 Insiderwissen
43 Von Python 2 nach Python 3
A Anhang
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 464 KB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Python 3 von Johannes Ernesti, Peter Kaiser
Das umfassende Handbuch
Buch: Python 3

Python 3
Pfeil 41 Wissenschaftliches Rechnen
Pfeil 41.1 Installation
Pfeil 41.2 Das Modellprogramm
Pfeil 41.2.1 Der Import von numpy, scipy und matplotlib
Pfeil 41.2.2 Vektorisierung und der Datentyp numpy.ndarray
Pfeil 41.2.3 Visualisieren von Daten mit matplotlib.pyplot
Pfeil 41.3 Überblick über die Module numpy und scipy
Pfeil 41.3.1 Überblick über den Datentyp numpy.ndarray
Pfeil 41.3.2 Überblick über scipy
 
Zum Seitenanfang

41.3    Überblick über die Module numpy und scipy  Zur vorigen ÜberschriftZur nächsten Überschrift

Dieser Abschnitt gibt Ihnen Hinweise zur praktischen Arbeit mit dem Datentyp numpy.ndarray. Außerdem zeigen wir Ihnen eine Übersichtstabelle der Untermodule von scipy.

 
Zum Seitenanfang

41.3.1    Überblick über den Datentyp numpy.ndarray Zur vorigen ÜberschriftZur nächsten Überschrift

Das Herzstück von numpy und scipy ist der Datentyp numpy.ndarray, der mehrdimensionale Arrays verwalten kann. Wir werden Ihnen daher in diesem Kapitel die Grundlagen für den Umgang mit numpy.ndarray vermitteln. Diese Einführung ist als erster Einstieg gedacht und deckt nicht alle Möglichkeiten ab, die Ihnen numpy.ndarray bietet.

Für weiterführende Informationen verweisen wir Sie auf die Onlinedokumentation von numpy auf der Seite http://docs.scipy.org/doc/ unter Numpy Reference Guide.

Die Form und der Datentyp eines Arrays

Ein Array ist eine Zusammenfassung mehrerer gleichartiger Elemente zu einer Einheit, wobei auf die Elemente über ganzzahlige Indizes zugegriffen werden kann. Wir werden uns in den Beispielen dieses Kapitels aus Gründen der Übersicht auf ein- und zweidimensionale Arrays beschränken.

Jedes Array hat eine Form und einen Datentyp. Dabei legt die Form die Dimensionen des Arrays fest, und der Datentyp gibt an, welche Art von Daten die Elemente des Arrays speichern können. Sowohl die Form als auch der Datentyp werden beim Erzeugen des Arrays festgelegt und können anschließend nicht mehr verändert werden.

Strukturell ähneln Arrays verschachtelten list-Instanzen. Arrays sind jedoch darauf optimiert, eine große Zahl von gleichartigen Datenobjekten zu speichern und mit ihnen zu rechnen. Eine Liste hingegen kann Referenzen auf beliebige Datenobjekte verwalten, was durch eine im Vergleich zum Array langsamere Geschwindigkeit erkauft wird.

Tabelle 41.2 listet die wichtigsten verfügbaren Datentypen für die Elemente von numpy.ndarray-Instanzen auf.[ 231 ](Die Datentypen heißen genauso wie die eingebauten numerischen Datentypen von Python, da sie ähnliche Werte speichern können. Es handelt sich dennoch um besondere Datentypen für den Umgang mit numpy. )

Name Beschreibung der möglichen Werte
numpy.bool boolesche Werte (True oder False), die intern jeweils als ein Byte gespeichert werden
numpy.int ganze Zahlen, wobei je nach Plattform 32 oder 64 Bit zur Speicherung verwendet werden
numpy.float Gleitkommazahlen doppelter Genauigkeit, für die 64 Bit Speicherplatz verwendet werden
numpy.complex komplexe Zahlen, wobei sowohl Real- als auch Imaginärteil als 64‐Bit-Gleitkommazahl gespeichert werden

Tabelle 41.2    Übersicht über die wichtigsten Datentypen von numpy

Neben diesen Basistypen gibt es noch eine Reihe weiterer Typen, die sich genauso verhalten wie die Basisdatentypen, allerdings eine andere Menge an Speicher belegen.

So bezeichnet int8 beispielsweise einen Typ, der ganze Zahlen mit 8 Bit speichern kann. Für Details zu diesen Typen verweisen wir Sie auf die Onlinedokumentation von numpy.

Bei der Erzeugung von Arrays sollten Sie immer darauf achten, den richtigen Typ anzugeben, da ansonsten Ungenauigkeiten auftreten können, wenn der gewählte Datentyp nicht den Wertebereich abbilden kann, mit dem Sie arbeiten möchten.

Erzeugen von Arrays und grundlegende Eigenschaften

Im Modellprogramm des letzten Abschnitts wurden bereits eindimensionale Arrays mithilfe der Funktionen numpy.array und numpy.linspace erzeugt, wie es das folgende Beispiel zeigt:

>>> np.array([-1, 4, -5, 7])
array([-1, 4, -5, 7])
>>> np.linspace(0, 1, 11)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

Jedes Array besitzt ein Attribut dtype, das den Datentyp des Arrays speichert.

>>> x = np.array([-1, 4, -5, 7])
>>> x.dtype
dtype('int64')
>>> y = np.array([-1, 4, -5.2, 7])
>>> y.dtype
dtype('float64')

Wie Sie sehen, hängt der gewählte Datentyp davon ab, welche Werte der Funktion numpy.array übergeben wurden. Dabei wählt numpy immer einen möglichst einfachen Typ, der alle übergebenen Werte speichern kann. Dies kann eine ungewollte Einschränkung sein, wenn ein Array nach der Erzeugung andere Werte speichern soll. Beispielsweise kann das Array x des oben genannten Beispiels keine Gleitkommazahlen speichern.

Um den Datentyp eines Arrays explizit festzulegen, können Sie den meisten Funktionen zur Erzeugung von Arrays einen Schlüsselwortparameter dtype übergeben.

>>> x = np.array([-1,4,-5,7], dtype=np.float)
>>> x
array([-1., 4., -5., 7.])
>>> x.dtype
dtype('float64')

Die Form als zweite grundlegende Eigenschaft eines Arrays wird in dem Attribut shape gespeichert.

>>> x.shape
(4,)

Das Attribut shape speichert ein Tupel, das für jede Dimension des Arrays die Anzahl der Komponenten speichert. Im Beispiel hat das Array x demnach eine Dimension mit vier Komponenten.

Um ein Array mit mehreren Dimensionen zu erzeugen, können Sie der Funktion numpy.array eine verschachtelte Struktur von iterierbaren Objekten übergeben. Im einfachsten Fall ist dies eine Liste, die weitere Listen enthält.

>>> b = np.array([[1,2], [3,4], [5,6]])
>>> b
array([[1, 2],
[3, 4],
[5, 6]])
>>> b.shape
(3, 2)

In diesem Beispiel wird ein Array mit zwei Dimensionen, also eine Matrix, erzeugt, die zeilenweise die Elemente der übergebenen Listen beinhaltet.

Es gibt eine Reihe spezieller Funktionen, mit denen Arrays einer bestimmten Gestalt erzeugt werden können. Tabelle 41.3 gibt Ihnen eine kurze Übersicht über einige dieser Funktionen.

Name Beschreibung
array(object) Erzeugt ein Array aus den von object referenzierten Daten. Häufig ist object eine Referenz auf eine verschachtelte Liste.
linspace(start, stop, num) Erzeugt ein Array, das num äquidistante Datenpunkte von start bis stop (jeweils inklusive) enthält.
empty(shape) Erzeugt ein Array mit den Ausmaßen shape. Der Parameter shape ist dabei ein Tupel, das für jede Dimension die Anzahl der gewünschten Komponenten enthält.
Die Werte des Arrays werden nicht initialisiert, weshalb sie willkürliche Zahlen enthalten können.
eye(N, [M, k]) Erzeugt ein zweidimensionales Array mit N Zeilen und M Spalten, das überall mit Ausnahme der Hauptdiagonalen Nullen enthält. Auf der Hauptdiagonalen wird der Wert 1 gesetzt.
Über den Parameter k kann die Diagonale mit dem Wert 1 verschoben werden.
Wird der Parameter M nicht angegeben, wird ein Array mit N Zeilen und N Spalten erzeugt.
ones(shape) Erzeugt ein Array der Form shape, dessen Elemente alle den Wert 1 haben.
zeros(shape) Erzeugt ein Array der Form shape, dessen Elemente alle den Wert 0 haben.
diag(v, [k]) Erzeugt ein Array, das auf der Hauptdiagonalen die Werte der Sequenz v besitzt und dessen sonstige Elemente mit 0 aufgefüllt werden.
Über den Parameter k kann die Diagonale verschoben werden, die die Werte von v annehmen soll.

Tabelle 41.3    Einige der Funktionen zum Erzeugen von Arrays

Als Beispiel möchten wir eine 9*9-Matrix erzeugen, die auf der Hauptdiagonalen die Werte von 1 bis 9 und auf den beiden Nebendiagonalen den Wert 5 hat. Alle anderen Werte sollen mit 3 belegt sein.

>>> M = 3*(np.ones((9,9)) - np.eye(9,9))
>>> M += 2*(np.eye(9,9,1) + np.eye(9,9,-1))
>>> M += np.diag(range(1,10))

Dazu erzeugen wir zunächst mit np.ones und np.eye eine Matrix M, die überall bis auf die Hauptdiagonale den Wert 3 hat. Anschließend addieren wir zu den beiden Nebendiagonalen mittels np.eye den Wert 2 hinzu, um auf die gewünschte 5 zu kommen. Zum Schluss erzeugen wir mithilfe von np.diag eine Diagonalmatrix mit den Werten von 1 bis 9 auf der Hauptdiagonalen und addieren diese zu M, um das Endergebnis zu erhalten.

>>> M
array([[ 1., 5., 3., 3., 3., 3., 3., 3., 3.],
[ 5., 2., 5., 3., 3., 3., 3., 3., 3.],
[ 3., 5., 3., 5., 3., 3., 3., 3., 3.],
[ 3., 3., 5., 4., 5., 3., 3., 3., 3.],
[ 3., 3., 3., 5., 5., 5., 3., 3., 3.],
[ 3., 3., 3., 3., 5., 6., 5., 3., 3.],
[ 3., 3., 3., 3., 3., 5., 7., 5., 3.],
[ 3., 3., 3., 3., 3., 3., 5., 8., 5.],
[ 3., 3., 3., 3., 3., 3., 3., 5., 9.]])

Dieses Vorgehen, mithilfe der vorgefertigten Bausteine komplexere Arrays zusammenzubauen, ist typisch für den Umgang mit numpy.ndarray.

Zugriff auf die Elemente eines Arrays

Auf die einzelnen Elemente eines Arrays kann wie bei Listen über einen Index zugegriffen werden. Auch das Slicing funktioniert bei eindimensionalen Arrays analog zum Slicing bei Listen.[ 232 ](Es gibt noch weiterführende Slicing-Möglichkeiten für Arrays mit mehr als zwei Dimensionen. Für die Details verweisen wir Sie auf die Onlinedokumentation von numpy. )

>>> a = np.array([-1,4,-5,7])
>>> a[2]
-5
>>> a[2:]
array([-5, 7])

Da numpy.ndarray ein mutabler Datentyp ist, können die Werte eines Arrays auch nach der Erzeugung verändert werden.

>>> a[2] = 1337
>>> a
array([ -1, 4, 1337, 7])
>>> a[0:2] = [-20, -20]
>>> a
array([ -20, -20, 1337, 7])

Hat ein Array mehrere Dimensionen, bestehen die Indizes für einzelne Elemente aus mehreren Zahlen.

>>> a = np.zeros((5,5))
>>> a[0,1] = 1
>>> a[3,2] = 2
>>> a[1,3] = 3
>>> a
array([[ 0., 1., 0., 0., 0.],
[ 0., 0., 0., 3., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 2., 0., 0.],
[ 0., 0., 0., 0., 0.]])

Auch das Slicing funktioniert mit mehrdimensionalen Arrays, indem für jede Dimension ein Bereich angegeben wird. Auf diese Weise können Sie beispielsweise gezielt einzelne Blöcke einer Matrix verändern.

>>> a[0:3,0:3] = 5*np.ones((3,3))
>>> a[3:,3:] = 11
>>> a
array([[ 5., 5., 5., 0., 0.],
[ 5., 5., 5., 3., 0.],
[ 5., 5., 5., 0., 0.],
[ 0., 0., 2., 11., 11.],
[ 0., 0., 0., 11., 11.]])

Dabei können Sie einem ganzen Block eine Zahl zuweisen, wie es in der zweiten Zeile des oben dargestellten Beispiels gezeigt wird. In diesem Fall wird jedem Eintrag des betreffenden Blocks der Wert 11 zugewiesen.

Genauso ist es möglich, aus einer bestehenden Matrix einen Teil zu extrahieren.

>>> b = a[1:4,1:4]
>>> b
array([[ 5., 5., 3.],
[ 5., 5., 0.],
[ 0., 2., 11.]])

Allerdings ist hier Vorsicht geboten, denn die Matrizen a und b teilen sich dieselben Daten, sodass Änderungen an der Matrix b auch die Matrix a betreffen und umgekehrt. Um einen Teil einer Matrix zu kopieren, verwenden Sie die Methode copy() des Datentyps numpy.ndarray. Das folgende Beispiel extrahiert den gleichen Bereich aus a wie das Beispiel zuvor, allerdings werden die Daten diesmal kopiert.

>>> b = a[1:4,1:4].copy()

Zum Abschluss dieser Einführung erhalten Sie eine Übersicht über eine Auswahl von Attributen und Methoden des Datentyps numpy.ndarray. Dabei ist a eine Instanz von numpy.ndarray.

Zur Übersicht wurden einige Parameterlisten vereinfacht. Für eine vollständige Liste verweisen wir Sie auf die Onlinedokumentation.

Name Beschreibung
Attribute
a.shape Beschreibt die Form des Arrays a als Tupel.
a.ndim Gibt die Anzahl der Dimensionen des Arrays a an.
a.size Gibt die Gesamtanzahl der Elemente des Arrays a an.
a.itemsize Gibt an, wie viele Bytes jedes einzelne Element des Arrays a im Speicher belegt.
a.dtype Beschreibt den Datentyp der Elemente des Arrays a.
a.nbytes Gibt den Speicher in Bytes an, den die Elemente von a insgesamt belegen.
a.real Gibt ein Array zurück, das die Realteile der Elemente von a als Elemente enthält.
a.imag Gibt ein Array zurück, das die Imaginärteile der Elemente von a als Elemente enthält.
Generelle Methoden
a.tolist() Erzeugt eine verschachtelte Liste, die die Elemente von a enthält.
a.dump(file) Schreibt das Array a so in das Dateiobjekt file, dass es anschließend mit dem Modul pickle wieder ausgelesen werden kann.
Näheres zum Modul pickle erfahren Sie in Abschnitt 33.4, »Serialisierung von Instanzen – pickle«.
a.astype(dtype) Erzeugt eine Kopie des Arrays a. Die Elemente des resultierenden Arrays haben dabei den Datentyp dtype.
a.copy() Erzeugt eine Kopie des Arrays a.
a.fill(value) Setzt alle Elemente von a auf den Wert value.
Methoden für die Größenanpassung
a.reshape(shape) Gibt ein Array der Form shape zurück, das die gleichen Daten wie a enthält. Teilt sich das zurückgegebene Array und seine Daten mit a.
a.resize(new_shape) Verändert die Form von a in-place zu der Form new_shape.
a.transpose() Gibt ein Array zurück, das die an der Hauptdiagonalen gespiegelten Werte von a enthält. Dabei teilen sich das zurückgegebene Array und a dieselben Daten.
a.flatten() Kopiert die Elemente des Arrays a in ein Array mit einer Dimension, indem die Daten aus mehreren Dimensionen aneinandergehängt werden.
a.ravel() wie a.flatten, außer dass keine Kopie erzeugt wird, sodass sich das zurückgegebene Array die Daten mit a teilt
Berechnungsmethoden
a.argmax() Gibt den Index eines Elements von a zurück, das den größten Wert in a hat.
a.max Gibt den größten Wert in a zurück.
a.argmin() Gibt den Index eines Elements von a zurück, das den kleinsten Wert in a hat.
a.min() Gibt den kleinsten Wert in a zurück.
a.clip(min, max) Gibt ein Array zurück, bei dem die Werte von a durch min und max limitiert wurden.
a.conj() Erzeugt ein neues Array aus dem Array a, indem alle Elemente komplex konjugiert werden.
a.sum() Gibt die Summe aller Elemente von a zurück.
a.mean() Gibt den Mittelwert aller Elemente in a zurück.
a.var() Berechnet die Varianz aller Elemente von a.
a.std() Berechnet die Standardabweichung aller Elemente von a.
a.prod() Gibt das Produkt aller Elemente von a zurück.
a.all() Gibt True zurück, wenn der Wahrheitswert aller Elemente von a True ist. Ist dies nicht der Fall, wird False zurückgegeben.
a.any() Gibt True zurück, wenn es in a ein Element gibt, dessen Wahrheitswert True ist. Ansonsten wird False zurückgegeben.

Tabelle 41.4    Eine Auswahl von Attributen und Methoden des Datentyps numpy.ndarray

Der geschickte Umgang mit dem Datentyp numpy.ndarray erfordert einige Übung. Haben Sie sich aber einmal an die Besonderheiten der Vektorisierung gewöhnt, können Sie sehr kompakte und effiziente Programme damit schreiben.

 
Zum Seitenanfang

41.3.2    Überblick über scipy Zur vorigen ÜberschriftZur nächsten Überschrift

Das Modul scipy bietet eine Reihe von Untermodulen für bestimmte Arten von Berechnungen. Tabelle 41.5 gibt Ihnen einen Überblick, welche Module vorhanden sind und welche Funktionalitäten sie bereitstellen.

Nähere Informationen zu den angegebenen Modulen können Sie der Onlinedokumentation von scipy unter http://docs.scipy.org/doc/scipy/reference/ entnehmen.

Untermodul Beschreibung
cluster Bietet Funktionen zur Clusteranalyse, um Datensätze zu kategorisieren.
constants Stellt mathematische und physikalische Konstanten bereit.
fftpack Bietet Funktionen für die diskrete Fourier-Transformation (implementiert mit der Fast Fourier Transform). Außerdem werden Differentialoperatoren und Faltungen bereitgestellt.
integrate Stellt Funktionen bereit, um Integrale numerisch zu approximieren. Dabei können sowohl Funktionsobjekte als auch Listen mit diskreten Funktionswerten integriert werden.
Zusätzlich gibt es Funktionen, mit deren Hilfe gewöhnliche Differentialgleichungen in einer oder mehreren Dimensionen numerisch gelöst werden können.
interpolate Stellt Funktionen für die Interpolation bereit. Dabei werden unter anderem Polynominterpolation (Lagrange und Taylor) sowie Splines in einer und mehreren Dimensionen unterstützt.
io Bietet Komfortfunktionen, um Daten aus verschiedenen Formaten zu lesen und zu schreiben.
Unterstützt werden Daten der Programme MATLAB und IDL sowie das Format Matrix Market File und Arff-Dateien.
Außerdem können Daten im NetCDF-Format sowie WAV-Sounddateien gelesen und geschrieben werden.
linalg Bietet Funktionen aus der linearen Algebra an.
Dazu gehören Funktionen zum Lösen linearer Gleichungen, zur Berechnung von Eigenwerten und Eigenvektoren sowie Standardzerlegungen von Matrizen (beispielsweise LU, Cholesky, SVD).
Außerdem werden Matrizenfunktionen wie beispielsweise die Matrixexponentialfunktion implementiert und Funktionen zur Erzeugung spezieller Matrizen (beispielsweise die Hilbert-Matrix) angeboten.
misc Bietet generelle Funktionen an, die in keine der anderen Kategorien passen.
Dazu gehören beispielsweise Funktionen zur Berechnung der Fakultät oder der numerischen Differentiation.
ndimage Stellt Funktionen bereit, mit denen Bilddaten verarbeitet werden können.
Es gibt Filter- und Interpolationsfunktionen sowie Funktionen für Morphologie und Analyse.
odr Implementiert Regressionsroutinen für die orthogonale Regression, mit der auch Messfehler in den unabhängigen Variablen ausgeglichen werden können.
optimize Bietet Funktionen, um Extremwertaufgaben zu lösen und Nullstellen zu finden. Es werden Probleme in einer und mehreren Dimensionen mit und ohne Nebenbedingungen unterstützt.
signal Stellt Funktionen für die Signalverarbeitung bereit. Dazu gehören beispielsweise Filter- und Faltungsfunktionen sowie B-Splines und Wavelets.
sparse Bietet Funktionen für den effizienten Umgang mit dünn besetzten Matrizen.
spatial Bietet Funktionen, um Bereichsanfragen zu beantworten (k‐d-Baum).
Außerdem wird eine Klasse für die Delaunay-Triangulierung angeboten.
special Stellt eine Menge spezieller Funktionen wie beispielsweise die Gamma-Funktion oder Orthogonalpolynome bereit.
stats Bietet vielfältige statistische Funktionen und Wahrscheinlichkeitsverteilungen.
weave Ermöglicht es, C/C++-Code in Python-Programme einzubetten.

Tabelle 41.5    Untermodule von scipy

Zusätzlich zu den Modulen, die in scipy enthalten sind, gibt es eine Reihe weiterer Module, die aus verschiedenen Gründen nicht zum Standardumfang von scipy gehören. Diese Module sind unter der Bezeichnung SciKits zusammengefasst und können unter der Internetadresse http://scikits.appspot.com/ heruntergeladen werden.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Python 3 Python 3
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Einstieg in Python
Einstieg in Python


Zum Rheinwerk-Shop: Python. Der Grundkurs
Python. Der Grundkurs


Zum Rheinwerk-Shop: Algorithmen mit Python
Algorithmen mit Python


Zum Rheinwerk-Shop: Objektorientierte Programmierung
Objektorientierte Programmierung


Zum Rheinwerk-Shop: Raspberry Pi. Das umfassende Handbuch
Raspberry Pi. Das umfassende Handbuch


Zum Rheinwerk-Shop: Roboter-Autos mit dem Raspberry Pi
Roboter-Autos mit dem Raspberry Pi


Zum Rheinwerk-Shop: Neuronale Netze programmieren mit Python
Neuronale Netze programmieren mit Python


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern