NumPy: Eine kleine Einführung Authors: Date: Version: Berthold Höllmann 2009-09-06 13:33:01 +0200 (So, 06 Sep 2009) 23 Inhalt 1 Paket für wissenschftl. Rechnen 2 2 Weitere Anwendungen 2 3 Quellen 2 4 Paketübersicht 4.1 Erläuterungen zu den Paketen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 5 Geschwindigkeit: Buildin Beispiel 3 6 Geschwindigkeit: NumPy Beispiel 3 7 Geschwindigkeit: Messung 3 8 Indizierung 4 9 Speicherlayout 4 10 Weitere Funktionen 1 5 11 Weitere Funktionen 2 5 12 Lineare Gleichungssysteme 5 13 Lineare Gleichungssysteme 2 5 14 Lineare Gleichungssysteme 3 5 15 Plotten 6 16 Plotten: Ergebnis 6 17 Plotten 2 6 18 Plotten 2: Ergebnis 7 19 Diskussion 7 1 1 Paket für wissenschftl. Rechnen Das Zugrunde liegende Paket, das für wissenschaftliches Rechnen mit Python benötigt wird heißt NumPy. Dieses Paket enthält: • Ein mächtiges, n-dimensionales Array Objekt • Ausgereifte (überladene) Funktionen • Grundlegende Funktionen zur Lösung Linearer Gleichungssysteme • Grundlegende Funktionen zur Fourier Transformation • Ausgereifte Zufallsgeneratoren • Werkzeuge zur Integration von FORTRAN Code. 2 Weitere Anwendungen Darüber hinaus kann NumPy als effizienter, mehrdimensionaler Container für generische Datentypen verwendet werden. Es können beliebige Datentypen definiert werden. 3 Quellen 1 NumPy: Homepage Guide to NumPy: Trelgol Publishing 2 • Preis: $39.99 • Geschrieben von Travis E. Oliphant • Market-Determined Temporary Distribution Restriction (MDTDR) model. • World Price: $200.000; Frei erhältlich spätestens ab 30. Oktober 2010 3 NumPy Example List: Liste mit NumPy Beispielen 4 Paketübersicht Paket core lib linalg fft random distutils testing f2py Anwendung Basisobjekte Zusätzliche Werkzeuge Einfache Lineare Algebra Diskrete Fourier-Transformation Zufallszahlen Generatoren Erweitertes bauen und verteilen Unit Testen Automatisches einbinden von FORTRAN Code 2 4.1 Erläuterungen zu den Paketen core: Alle Namen werden nach numpy exportiert lib: Alle Namen werden nach numpy exportiert linalg: Das alte LinearAlgebra aus Numeric fft: Das alte FFT aus Numeric random: Das alte RandomArray aus Numeric distutils: Erweiterungen, aufsetzend auf dem Standard distutils Paket testing: Funktionen Hilfreich zum Testen f2py: Hilfreiches Dienstprogramm das von SciPy benötigt wird 5 Geschwindigkeit: Buildin Beispiel samp1 buildin.py : def test(): a = list(range(100000)) b = list(range(100000)) return [ A*B for A, B in zip(a, b) ] c = test() print c[2], c[4], c[999] >>> import samp1_buildin 4 16 998001 6 Geschwindigkeit: NumPy Beispiel samp1 numpy.py : from numpy import * def test(): a, b = arange(100000), arange(100000) return a*b c = test() print c[2], c[4], c[999] print take(c, [2, 4, 999]) >>> import samp1_numpy 4 16 998001 [ 4 16 998001] 7 Geschwindigkeit: Messung >>> import timeit >>> t1 = timeit.Timer("samp1_buildin.test()") >>> print "%.2f usec/pass" % ( ... t1.timeit(number=20)) # doctest: +SKIP 2.81 usec/pass >>> t2 = timeit.Timer("samp1_numpy.test()") >>> print "%.2f usec/pass" % ( ... t2.timeit(number=20)) # doctest: +SKIP 0.08 usec/pass 3 8 Indizierung • Python bietet leistungfähige Indizierung • NumPy nutzt diese voll aus, einige indizierungs Fähigkeiten in Python kommen aus Numeric • Einige Beispiele: – [:,3] liefert die vierte Zeile“ des Arrays. : liefert alle elemente Dimensionen. ” >>> from numpy import * >>> a = arange(60).reshape(3,4,5); print a [[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] <BLANKLINE> [[20 21 22 23 24] [25 26 27 28 29] [30 31 32 33 34] [35 36 37 38 39]] <BLANKLINE> [[40 41 42 43 44] [45 46 47 48 49] [50 51 52 53 54] [55 56 57 58 59]]] – Ein weiterer Platzhalter is .... Er liefert alle passenden Dimensionen. >>> print a[...,3] [[ 3 8 13 18] [23 28 33 38] [43 48 53 58]] >>> print a[1,...,3] [23 28 33 38] >>> print a[:,:,2] [[ 2 7 12 17] [22 27 32 37] [42 47 52 57]] >>> print a[0,::2,::2] [[ 0 2 4] [10 12 14]] 9 Speicherlayout • Anordnung kontinuierlich und nicht kontinuierlich möglich. • Kontinuierliche Anordnung entspricht C-Arrays • Nichtkontinuierliche Anordung ist möglich: – Arraygröße wird zur Laufzeit geändert – Spalten / Zeilenlogik wird zwischen C und FORTRAN umgeschaltet. • Viele Funktionen können nichtkontinuierliche Anordnung berücksichtigen, andernfalls werden die Daten kopiert. 4 10 Weitere Funktionen 1 >>> a = empty(5, dtype=object); b= "test" >>> print a [None None None None None] >>> a[:] = b >>> print a, maximum.reduce(a) [test test test test test] test 11 Weitere Funktionen 2 >>> a = eye(4)*(arange(4)+2.) >>> print a, maximum.reduce(a) [[ 2. 0. 0. 0.] [ 0. 3. 0. 0.] [ 0. 0. 4. 0.] [ 0. 0. 0. 5.]] [ 2. 3. 4. 5.] >>> print maximum.reduce( ... maximum.reduce(a)) 5.0 >>> a[0,-1] = 7 >>> print maximum.reduce(a) [ 2. 3. 4. 7.] >>> print maximum.reduce(a, axis=1) [ 7. 3. 4. 5.] 12 Lineare Gleichungssysteme >>> A = array(((0., 2., 0, 1.), ... (2., 2., 3, 2.), ... (4., -3., 0, 1.), ... (6., 1., -6, -5.))) >>> b = array((0, -2, -7, 6)) >>> import numpy.linalg as LA >>> print LA.solve(A, b) #doctest: +NORMALIZE_WHITESPACE [-0.5 1. 0.33333333 -2. ] 13 Lineare Gleichungssysteme 2 >>> b = transpose(array(((0, -2, -7, 6), ... (0, 2, 7, -6)))) >>> x = LA.solve(A, b) >>> print x [[-0.5 0.5 ] [ 1. -1. ] [ 0.33333333 -0.33333333] [-2. 2. ]] 14 Lineare Gleichungssysteme 3 >>> print dot(A, x) - b 5 [[ -8.88178420e-16 8.88178420e-16] [ 1.33226763e-15 -1.33226763e-15] [ 0.00000000e+00 0.00000000e+00] [ 1.77635684e-15 -1.77635684e-15]] >>> print allclose(dot(A, x), b) True 15 Plotten matplotlib4 >>> >>> >>> >>> >>> x = arange(-2*pi, 2*pi, 0.2) y = sin(x) import pylab # matplotlib lines = pylab.plot(x, y) pylab.savefig(’sin.png’) 16 Plotten: Ergebnis 17 Plotten 2 >>> >>> >>> >>> >>> p = subtract.outer(sin(x), cos(x)) lines = pylab.contourf(p) pylab.savefig(’sincos.png’) pylab.savefig(’sincos.eps’) pylab.savefig(’sincos.svg’) 6 18 Plotten 2: Ergebnis 19 Diskussion Fragen / Anmerkungen? Links Hamburger Python User Group • 2007/05/16 View document source. Generated on: 2009-09-28 13:14 UTC. Generated by Docutils from reStructuredText source. 1 http://www.scipy.org/NumPy 2 http://www.tramy.us/ 3 http://www.scipy.org/Numpy Example List 4 http://matplotlib.sourceforge.net/ 7