Tablice NumPy: wprowadzenie [z przykładami]
Opublikowany: 2022-12-08Chcesz zacząć korzystać z NumPy? Ten przewodnik nauczy Cię podstaw tablic NumPy w Pythonie.
Na początek dowiesz się, jak tablice NumPy działają inaczej niż listy Pythona. Następnie nauczysz się kilku sposobów tworzenia tablic NumPy i wykonywania na nich podstawowych operacji.
Zaczynajmy!
Podstawy tablic NumPy
NumPy to jedna z najpopularniejszych bibliotek Pythona do obliczeń naukowych i analizy danych. Podstawowymi strukturami danych w NumPy są tablice N-wymiarowe (tablice ND). Mają możliwości rozgłaszania i pozwalają nam na wektoryzację operacji w celu przyspieszenia i wykorzystanie wbudowanych funkcji matematycznych do poprawy wydajności.
Aby rozpocząć pracę z NumPy, należy najpierw zainstalować bibliotekę i zaimportować ją do swojego środowiska pracy. Jest dostępny jako pakiet PyPI, który można zainstalować za pomocą pip.
Aby zainstalować NumPy, otwórz terminal i uruchom następujące polecenie:
pip3 install numpy Po zainstalowaniu NumPy możesz zaimportować go do swojego środowiska pracy pod aliasem. Zwykły alias to np .
import numpy as npUwaga : Importowanie NumPy pod aliasem
npnie jest wymogiem, ale zalecaną konwencją.
Listy Pythona a tablice NumPy
Rozważ następującą listę liczb w Pythonie:
py_list = [1,2,3,4] Możesz uzyskać tablicę NumPy z istniejącej listy, wywołując funkcję np.array() z listą jako argumentem.
np_arr1 = np.array(py_list) print(np_arr1) [1 2 3 4] Aby sprawdzić typ np_arr1 , wywołujesz wbudowaną funkcję type() , zobaczysz, że jest to ndarray , podstawowa struktura danych w NumPy.
type(np_arr1) # numpy.ndarrayChociaż lista Pythona i tablica NumPy mogą wyglądać podobnie, istnieją pewne różnice:
- Lista Pythona może przechowywać obiekty o różnych typach danych, podczas gdy tablica NumPy zawiera elementy tego samego typu danych. Domyślnym typem danych jest float z dokładnością do 64 bitów (float64).
- Elementy listy Pythona niekoniecznie są przechowywane w ciągłych lokalizacjach w pamięci. Jednak elementy tablicy NumPy są przechowywane w ciągłym bloku w pamięci. W rezultacie wyszukiwanie i uzyskiwanie dostępu do elementów jest szybsze.
Przyjrzyjmy się kilku innym różnicom.
Nadawanie
Potężną funkcją tablic NumPy jest rozgłaszanie. Załóżmy, że chcielibyśmy dodać 2 do wszystkich elementów np_arr1 i py_list .
Spróbujmy dodać 2 do py_list i zobaczmy, co się stanie:
>>> py_list + 2Widzimy, że otrzymujemy TypeError stwierdzający, że możemy połączyć tylko dwie listy, a dodanie py_list + 2 w ten sposób nie jest obsługiwane.
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-c0f9974899df> in <module> ----> 1 py_list + 2 TypeError: can only concatenate list (not "int") to list Spróbujmy wykonać tę samą operację na tablicy np_arr1 .
>>> np_arr1 + 2W rezultacie widzimy, że do każdego elementu tablicy dodano 2.
array([3, 4, 5, 6])Dzieje się tak, ponieważ NumPy niejawnie rozgłaszało skalar 2 do tablicy o zgodnym kształcie, aby uzyskać ten wynik.
Wektoryzacja
Tablice NumPy obsługują wektoryzację dla szybszych operacji na elementach. Załóżmy, że chcielibyśmy znaleźć elementarną sumę dwóch tablic.
Użycie prostej operacji + na liście zwróciłoby konkatenację dwóch list (co nie jest tym, czego chcemy!).
>>> py_list + py_list # [1, 2, 3, 4, 1, 2, 3, 4] Ale ta sama operacja na tablicy NumPy, np_arr1 , zwraca elementarną sumę np_arr1 ze sobą.
>>> np_arr1 + np_arr1 # array([2, 4, 6, 8])Podobnie zagnieżdżone listy mogą wyglądać podobnie do N-wymiarowej tablicy NumPy. Jednak różnice omówione do tej pory utrzymują się.
nested_list = [[1,2],[3,4],[5,6]] np_arr2 = np.array(nested_list) print(np_arr2) [[1 2] [3 4] [5 6]]Jak tworzyć tablice NumPy
Zawsze możesz tworzyć tablice NumPy z istniejących list Pythona, używając np.array(list-obj) . Nie jest to jednak najskuteczniejszy sposób.
Zamiast tego możesz użyć kilku wbudowanych funkcji, które pozwalają tworzyć tablice o określonym kształcie. Kształt tablicy to krotka, która określa rozmiar tablicy wzdłuż każdego wymiaru. Na przykład kształt tablicy 2×2 z dwoma wierszami i dwiema kolumnami to (2,2). W tej sekcji nauczymy się, jak korzystać z niektórych wbudowanych funkcji.

Tworzenie tablic zer i jedynek
Często pomocne jest utworzenie tablicy określonych wymiarów wypełnionej samymi zerami lub samymi jedynkami. A następnie wykorzystywać je i modyfikować w kolejnych krokach programu.
Możemy użyć funkcji zeros() do utworzenia tablicy zer. Przekaż kształt wymaganej tablicy jako krotkę: np.zeros(shape) .
array0 = np.zeros((3,3)) print(array0)Oto wynik, dwuwymiarowa tablica zer:
[[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]] Możesz uzyskać dostęp do atrybutów tablicy NumPy, atrybutów wywołania, takich jak dtype i shape , używając notacji kropkowej, jak pokazano poniżej:
print(array0.dtype) # float64 print(array0.shape) # (3, 3) Aby uzyskać tablicę jedynek, możesz użyć funkcji np.ones() .
array1 = np.ones((3,3)) print(array1) [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]Tworzenie macierzy tożsamości
Macierz tożsamości jest szeroko stosowana w kilku zastosowaniach w algebrze liniowej. I możesz użyć funkcji np.eye() do utworzenia macierzy tożsamości. Funkcja np.eye() przyjmuje tylko jeden argument: kolejność macierzy ( n ).
arrayi = np.eye(3) print(arrayi) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]Tworzenie tablic liczb losowych
Możesz także tworzyć tablice o określonym kształcie wypełnione losowymi liczbami pochodzącymi z określonych rozkładów. Powszechnie stosowanymi rozkładami prawdopodobieństwa są rozkład jednostajny i standardowy rozkład normalny.
Funkcja randn() , która jest częścią modułu random NumPy, może służyć do generowania tablic liczb próbkowanych ze standardowego rozkładu normalnego . Standardowy rozkład normalny to rozkład Gaussa z zerową średnią i jednostkową wariancją.
std_arr = np.random.randn(3,4) print(std_arr) [[-0.13604072 1.21884359 2.06850932 0.78212093] [ 0.44314719 -0.78084801 -0.70517138 1.17984949] [ 1.13214829 1.02339351 0.15317809 1.83191128]] np.random.rand() zwraca tablicę liczb próbkowanych z rozkładu jednorodnego w przedziale [0,1].
uniform_arr = np.random.rand(2,3) print(uniform_arr) [[0.90470384 0.18877441 0.10021817] [0.741 0.10657658 0.71334643]] Możesz także utworzyć tablicę losowych liczb całkowitych za pomocą funkcji randint() , która jest częścią modułu losowego NumPy. np.random.randint(low, high, size) zwraca tablicę liczb całkowitych. Kształt tablicy jest wywnioskowany z argumentu size , a liczby całkowite przyjmują wartości z przedziału [low,high) .

Oto przykład:
int_arr = np.random.randint(1,100,(2,3)) print(int_arr) [[53 89 33] [24 85 33]]Inne przydatne wbudowane funkcje
Następnie przejrzyjmy kilka innych przydatnych funkcji do tworzenia tablic NumPy.
Funkcja arange() zwraca tablicę liczb między wartością start a końcową w stop wartości step : start , start + step , start + 2*step up to ale bez stop . Wartości start i step są opcjonalne . Domyślny rozmiar kroku to 1, a domyślna wartość początkowa to 0.
W tym przykładzie array_a jest tablicą liczb zaczynającą się od 1 i kończącą się na 10, ale bez uwzględnienia, w krokach co 0,5.
array_a = np.arange(1,10,0.5) print(array_a) [1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5] Możesz także tworzyć tablice równomiernie rozmieszczonych liczb, używając np.linspace() . Użyj np.linspace(start, stop, num) stop uzyskać tablicę num równomiernie rozmieszczonych liczb między wartościami start i końcową.
Tutaj arr_lin jest tablicą 5 równomiernie rozmieszczonych liczb w przedziale [1,10].
array_lin = np.linspace(1,10,5) print(array_lin) [ 1. 3.25 5.5 7.75 10. ] Podobnie arr_lin2 jest tablicą 10 równomiernie rozmieszczonych liczb w przedziale [1,20].
array_lin2 = np.linspace(1,20,10) print(array_lin2) [ 1. 3.11111111 5.22222222 7.33333333 9.44444444 11.55555556 13.66666667 15.77777778 17.88888889 20. ] W przeciwieństwie do funkcji arange() , funkcja linspace() domyślnie zawiera punkt końcowy.
Podstawowe operacje na tablicach NumPy
Następnie przejrzyjmy niektóre podstawowe operacje na tablicach NumPy.
Znajdowanie elementów minimalnych i maksymalnych
Ilekroć używamy funkcji z losowego modułu NumPy do tworzenia tablic, otrzymamy inny wynik za każdym razem, gdy kod zostanie uruchomiony. Aby uzyskać powtarzalne wyniki, powinniśmy ustawić ziarno: np.random.seed(seed_value) .
W poniższym przykładzie ustawiłem ziarno odtwarzalności, int_arr1 to tablica siedmiu losowych liczb całkowitych w przedziale [1100].
np.random.seed(27) int_arr1 = np.random.randint(1,100,7) print(int_arr1) # [20 57 73 32 57 38 25]- Aby znaleźć maksymalny element w tablicy, możesz wywołać metodę
max()na obiekcie tablicy,int_arr1i - Aby znaleźć minimalny element w tablicy, możesz wywołać metodę
min()na obiekcie tablicy,int_arr1.
int_arr1.max() # 73 int_arr1.min() # 20Znalezienie indeksu elementów maksymalnych i minimalnych
Czasami może być konieczne znalezienie indeksu elementów maksymalnych i minimalnych. W tym celu można wywołać metody argmax() i argmin() na obiekcie array.
Tutaj maksymalny element 73 występuje w indeksie 2.
int_arr1.argmax() # 2A minimalny element 20 występuje pod indeksem 0.
int_arr1.argmin() # 0Możesz także użyć
np.argmax(array)inp.argmin(array), aby znaleźć indeksy odpowiednio maksymalnego i minimalnego elementu. Dowiedz się więcej o funkcji NumPyargmax().
Jak połączyć tablice NumPy
Inną powszechną operacją, którą możesz chcieć wykonać na tablicach NumPy, jest konkatenacja.
Konkatenacja pionowa za pomocą vstack
Możesz łączyć tablice w pionie za pomocą funkcji vstack() .
Oto przykład. arr1 to tablica jedynek z dwoma wierszami i trzema kolumnami, a arr2 to tablica zer, dwa wiersze i trzy kolumny.
arr1 = np.ones((2,3)) arr2 = np.zeros((2,3)) Możemy połączyć te dwie tablice w pionie za pomocą funkcji vstack() , jak pokazano:
np.vstack((arr1,arr2)) array([[1., 1., 1.], [1., 1., 1.], [0., 0., 0.], [0., 0., 0.]])Ponieważ układanie odbywa się pionowo, obie tablice powinny mieć taką samą liczbę kolumn .
Zmieńmy arr2 na kształt (2,2). Ma teraz dwa wiersze i dwie kolumny.
arr1 = np.ones((2,3)) arr2 = np.zeros((2,2)) np.vstack((arr1,arr2))Dlatego konkatenacja pionowa nie jest możliwa i otrzymujemy błąd ValueError.
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-21-d5d3bf37fc21> in <module> ----> 1 np.vstack((arr1,arr2)) ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 3 and the array at index 1 has size 2Konkatenacja pozioma za pomocą hstack
Tablice NumPy można łączyć poziomo za pomocą funkcji hstack() , jak pokazano poniżej.
arr1 = np.ones((3,3)) arr2 = np.zeros((3,2)) np.hstack((arr1,arr2)) Ponieważ układanie odbywa się poziomo, tablice wejściowe powinny mieć taką samą liczbę wierszy . Tutaj zarówno arr1 , jak i arr2 mają trzy wiersze.
array([[1., 1., 1., 0., 0.], [1., 1., 1., 0., 0.], [1., 1., 1., 0., 0.]])Za pomocą konkatenatu
Możesz także użyć konkatenacji tablic NumPy wzdłuż określonej osi za pomocą funkcji concatenate() . Ustaw opcjonalny argument axis na oś, wzdłuż której chcesz połączyć; domyślna wartość osi wynosi zero.
Oto kilka przykładów:
arr1 = np.ones((2,3)) arr2 = np.zeros((2,3)) Jeśli nie określimy osi, wzdłuż której nastąpi konkatenacja, tablice zostaną połączone wzdłuż osi 0. W wynikowej tablicy druga tablica arr2 jest dodawana (jako wiersze) pod pierwszą tablicą.
np.concatenate((arr1,arr2)) array([[1., 1., 1.], [1., 1., 1.], [0., 0., 0.], [0., 0., 0.]]) Kiedy określimy axis = 1 , otrzymamy następujący wynik. arr2 jest łączony (jako kolumny) obok pierwszej tablicy, arr1 .
np.concatenate((arr1,arr2),axis=1) array([[1., 1., 1., 0., 0., 0.], [1., 1., 1., 0., 0., 0.]]) Podobnie jak w przypadku funkcji hstack() i vstack() , wymiary tablic wzdłuż osi konkatenacji powinny być zgodne .
Wniosek
W tym samouczku poznałeś różnice między tablicami NumPy a listami w języku Python, ze szczególnym uwzględnieniem zalet tablic N-wymiarowych pod względem szybkości i wydajności.
Poznałeś również kilka przydatnych funkcji do tworzenia tablic o określonym wymiarze i wykonywania typowych operacji, takich jak znajdowanie elementów minimalnych i maksymalnych, łączenie tablic i nie tylko.
Następnie naucz się przekształcać tablice NumPy.
