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 np
Uwaga : Importowanie NumPy pod aliasem
np
nie 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.ndarray
Chociaż 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 + 2
Widzimy, ż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 + 2
W 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_arr1
i - Aby znaleźć minimalny element w tablicy, możesz wywołać metodę
min()
na obiekcie tablicy,int_arr1
.
int_arr1.max() # 73 int_arr1.min() # 20
Znalezienie 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() # 2
A minimalny element 20 występuje pod indeksem 0.
int_arr1.argmin() # 0
Moż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 2
Konkatenacja 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.