Tablice NumPy: wprowadzenie [z przykładami]

Opublikowany: 2022-12-08

Chcesz 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.

Jak-tworzyć-NumPy-tablice

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 stepopcjonalne . 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) i np.argmin(array) , aby znaleźć indeksy odpowiednio maksymalnego i minimalnego elementu. Dowiedz się więcej o funkcji NumPy argmax() .

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.