NumPy - mini tutorial
05.07.2010 21:52
Czym jest NumPy?
NumPy jest podstawowym pakietem wykorzystywanym do obliczeń naukowych w języku Python. Pozwala między innymi na wykonywanie wydajnych operacji na macierzach, obliczenia numeryczne, obliczenia z zakresu algebry liniowej, FFT etc. Stanowi darmową alternatywę dla MATLAB-a. (więcej)
W programach do obliczeń numerycznych typu MATLAB należy dążyć do maksymalnej wektoryzacji kodu (1). Pozwala to zwiększyć efektywność obliczeń (2).
Jak korzystać z tego tutorialu?
Tutorial przeznaczony jest dla osób poszukujących darmowej alternatywy dla MATLAB-a. Z założenia stanowić ma wprowadzenie do czytelnej dokumentacji.
Instalacja
Na potrzeby poniższego tutorialu wymagany będzie:
lub jedno ze środowisk opisane w "Python w obliczeniach naukowych i inżynierskich".
Wstęp
Po zainstalowaniu Pythona i NumPy uruchamiamy z menu start IDLE (Python GUI) lub dowolne IDE obsługujące Pythona. Przed przystąpieniem do obliczeń należy zaimportować NumPy. Sposobów na to jest kilka.
Najczęściej wykorzystywane to:
import numpy as np
oraz
from numpy import *
Różnice między nimi najprościej jest przeanalizować na przykładzie.
>>> import numpy as np >>> np.pi * np.sqrt(4.0) 6.2831853071795862 >>> >>> from numpy import * >>> pi * sqrt(4.0) 6.2831853071795862 >>>
Jak widać drugi sposób jest wygodniejszy w użyciu i bardziej intuicyjny dla użytkowników MATLAB-a. Aby nie powtarzać czynności związanych z importowaniem NumPy przy każdym uruchomieniu wygodnie jest zainstalować interaktywną powłokę IPython + PyReadline.
Po uruchomieniu PyLab z menu Start możemy przystąpić do obliczeń.
Na początku jednak warto zaznajomić się z powłoką. Do ważniejszych jej cech należy uzupełnianie poleceń/wyświetlanie podpowiedzi po wciśnięciu Tab, wyświetlanie pomocy dla polecenia object?, możliwość odwoływania się do wcześniejszych wyników Out[x] tak jak w programie Mathematica. Aby wkleić przykład, fragment skryptu itp. należy wpisać cpaste, wkleić zawartość schowka, a następnie w nowej linii dodać -‑. Po zatwierdzeniu Enterem polecenia zawarte między cpaste, a -- zostaną wykonane.
Podstawowe operacje na macierzach
Podstawowy typ danych w NumPy stanowią macierze matrix oraz tablice array, które różnią się między sobą sposobem działania operatora * (mnożenie).
Występowanie tych dwóch typów oraz różne sposoby ich użycia wprowadzają użytkowników MATLAB-a w pewną dezorientację. O różnicach pomiędzy nimi można przeczytać na stronie NumPy for Matlab Users.
Najistotniejsze różnice to:
1. Obiekty klasy matrix można mnożyć podobnie jak w MATLAB-ie za pomocą *. Mnożenie elementu przez element odbywa się przy pomocy polecenia multiply().
2. Obiekty klasy array mnożymy za pomocą funkcji dot(), natomiast * oznacza mnożenie elementu przez element.
Podsumowując możemy przyjąć, że najbardziej odpowiednim dla większości przypadków rozwiązaniem jest stosowanie array. Jedyny problemem jest mnożenie wielu macierzy, gdzie zapis dot(dot(A,B),C) w przeciwieństwie do znanego z MATLAB-a A*B*C nie jest najwygodniejszym rozwiązaniem. W takich przypadkach możemy wykorzystać obiekt matrix. Obiekty matrix, array możemy stosować wymiennie. Dla obiektu array możliwe są typowe działania (*, /, +, ** etc.) wykonywane element po elemencie.
Rozważmy układ równań liniowych:
Zapiszmy macierze współczynników i wyrazów wolnych.
A = array([[1,-2,3],[-1,1,5],[-2,-1,1]])
B = array([[ 5, 10, 0]]).T
gdzie .T oznacza transpozycję.
Na tak zdefiniowanych macierzach możemy przetestować wyżej wymienione funkcje i operacje. Aby rozwiązać powyższy układ równań należy skorzystać z polecenia:
print linalg.solve(A,B)
Operacje na macierzach najprościej przećwiczyć na losowo generowanych macierzach o różnych rozmiarach, np.
D = rand(5,5) inv(D) # macierz odwrotna
Należy oczywiście pamiętać o zachowaniu zasad obowiązujących w matematyce;)
Ostatnią kwestią, na którą warto zwrócić uwagę i która wprowadza nieco zamieszania wśród użytkowników MATLAB-a jest rozpoczynanie się numeracji od zera. Np. element w pierwszym wierszu i pierwszej kolumnie macierzy A wywołamy w MATLAB-ie przy pomocy A(1,1), a w NumPy poprzez A[0,0].
Mam nadzieję, że ten wstęp pozwoli bez przeszkód sięgnąć do dokumentacji w celu głębszego zapoznania się z możliwościami NumPy.