Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

NumPy - mini tutorial

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:

- Python- NumPy

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. 

Komentarze

0 nowych
Olbi   10 #1 06.07.2010 00:59

A jak sprawa ma się pod dystrybucjami Linuksa? We większości dystrybucji typu Ubuntu, Fedora, openSUSE, python jest zainstalowany domyślnie i trzeba tylko dodać kilka rzeczy. Może warto by zrobić wpis na ten temat?

iluzion   5 #2 06.07.2010 03:37

@Olbi

Link do wpisu na ten temat znajduje się w tekście. Informacje tu zawarte są uniwersalne i niezależne od systemu operacyjnego.

borzole   4 #3 06.07.2010 08:04

Skoro idziesz naukową tematyką, to powinieneś napisać kiedyś o utworzeniu własnego modułu, ale w C dla wąskiego gardła.

iluzion   5 #4 06.07.2010 09:56

@borzole

Staram się, żeby wpisy były przystępne dla każdego, a temat który podałeś jest już całkiem konkretnym problemem... ale podsunąłeś mi pewien pomysł na kolejny wpis;)

borzole   4 #5 06.07.2010 12:14

@iluzion
"żeby wpisy były przystępne dla każdego"
...tiaaa, rachunek macierzowy, zastępowanie matlaba, żyjesz w świecie iluzji ;D

iluzion   5 #6 06.07.2010 12:42

@borzole

Dla każdego zainteresowanego;) Mam świadomość, że przy wpisach dotyczących benchmarków przeglądarek internetowych ta tematyka jest mało popularna, ale jest to odpowiedź na sugestię @przemo_li pod wcześniejszym wpisem o tej tematyce, który ma całkiem sporą liczę wyświetleń jak na tak niszowy temat.

  #7 06.07.2010 19:26

zamiast w tv, to na blogu DP, brawo za chęci iluzion. Popieram matematyczną tematykę.