Python: wektory, macierze i tablice z NumPy

Python Vectors Matrices



W tej lekcji przyjrzymy się kilku fajnym wskazówkom i sztuczkom, jak bawić się wektorami, macierzami i tablicami przy użyciu biblioteki NumPy w Pythonie. Ta lekcja jest bardzo dobrym punktem wyjścia, jeśli zaczynasz przygodę z Data Science i potrzebujesz wprowadzającego matematycznego przeglądu tych komponentów i tego, jak możemy się z nimi bawić za pomocą NumPy w kodzie.

Biblioteka NumPy pozwala nam wykonywać różne operacje, które należy wykonać na strukturach danych często używanych w uczeniu maszynowym i Data Science, takich jak wektory, macierze i tablice. Pokażemy tylko najczęstsze operacje z NumPy, które są używane w wielu potokach uczenia maszynowego. Na koniec, zwróć uwagę, że NumPy jest tylko sposobem wykonywania operacji, więc operacje matematyczne, które pokazujemy, są głównym przedmiotem tej lekcji, a nie sam pakiet NumPy. Zacznijmy.







Co to jest wektor?

Według Google wektor to wielkość mająca zarówno kierunek, jak i wielkość, szczególnie jako określenie położenia jednego punktu w przestrzeni względem drugiego.





Wektory są bardzo ważne w uczeniu maszynowym, ponieważ nie tylko opisują wielkość, ale także kierunek funkcji. Możemy stworzyć wektor w NumPy z następującym fragmentem kodu:





importuj numerjaknp

wiersz_wektor = np. tablica([1,2,3])
wydrukować(wektor_wierszowy)

W powyższym fragmencie kodu utworzyliśmy wektor wierszowy. Możemy również stworzyć wektor kolumnowy jako:

importuj numerjaknp

col_vector = np. tablica([[1],[2],[3]])
wydrukować(kol_wektor)

Tworzenie matrycy

Macierz może być po prostu rozumiana jako dwuwymiarowa tablica. Możemy stworzyć macierz za pomocą NumPy, tworząc tablicę wielowymiarową:



macierz = np. tablica([[1,2,3],[4,5,6],[7,8,9]])
wydrukować(matryca)

Chociaż macierz jest dokładnie podobna do tablicy wielowymiarowej, struktura danych macierzowych nie jest zalecana z dwóch powodów:

  1. Tablica to standard, jeśli chodzi o pakiet NumPy
  2. Większość operacji z NumPy zwraca tablice, a nie macierz

Korzystanie z macierzy rzadkiej

Przypomnijmy, że rzadka macierz to taka, w której większość pozycji wynosi zero. Obecnie powszechnym scenariuszem w przetwarzaniu danych i uczeniu maszynowym jest przetwarzanie macierzy, w których większość elementów wynosi zero. Rozważmy na przykład macierz, której wiersze opisują każdy film w serwisie YouTube, a kolumny reprezentują każdego zarejestrowanego użytkownika. Każda wartość wskazuje, czy użytkownik obejrzał film, czy nie. Oczywiście większość wartości w tej macierzy będzie wynosić zero. ten przewaga z rzadką matrycą jest to, że nie przechowuje wartości, które są zerowe. Skutkuje to ogromną przewagą obliczeniową i optymalizacją pamięci masowej.

Stwórzmy tutaj macierz iskier:

od scipy import sparse

oryginalna_macierz = np. tablica([[1,0,3],[0,0,6],[7,0,0]])
sparse_matrix = sparse.csr_matrix(oryginalna_macierz)
wydrukować(sparse_matrix)

Aby zrozumieć, jak działa kod, przyjrzymy się wynikom tutaj:

W powyższym kodzie użyliśmy funkcji NumPy do stworzenia Skompresowany rzadki rząd macierz, w której elementy niezerowe są reprezentowane przy użyciu indeksów liczonych od zera. Istnieją różne rodzaje rzadkiej macierzy, takie jak:

  • Skompresowana rzadka kolumna
  • Lista list
  • Słownik kluczy

Nie będziemy tu zagłębiać się w inne rzadkie matryce, ale wiemy, że każda z nich jest specyficzna i nikt nie może być określony jako „najlepszy”.

Stosowanie operacji na wszystkich elementach Vector

Jest to typowy scenariusz, gdy musimy zastosować wspólną operację do wielu elementów wektora. Można to zrobić, definiując lambdę, a następnie wektoryzując to samo. Zobaczmy fragment kodu dla tego samego:

macierz = np. tablica([
[1,2,3],
[4,5,6],
[7,8,9]])

mul_5 = lambda x: x* 5
vectorized_mul_5 = np.vectorize(mul_5)

vectorized_mul_5(matryca)

Aby zrozumieć, jak działa kod, przyjrzymy się wynikom tutaj:

W powyższym fragmencie kodu użyliśmy funkcji vectorize, która jest częścią biblioteki NumPy, aby przekształcić prostą definicję lambda w funkcję, która może przetwarzać każdy element wektora. Należy zauważyć, że wektoryzacja jest tylko pętla nad elementami i nie ma to wpływu na działanie programu. NumPy pozwala również nadawanie , co oznacza, że ​​zamiast powyższego skomplikowanego kodu moglibyśmy po prostu zrobić:

matryca* 5

A wynik byłby dokładnie taki sam. Chciałem najpierw pokazać złożoną część, w przeciwnym razie pominęlibyście tę sekcję!

Średnia, wariancja i odchylenie standardowe

Dzięki NumPy łatwo jest wykonywać operacje związane ze statystykami opisowymi na wektorach. Średnią wektora można obliczyć jako:

np. średnia(matryca)

Wariancję wektora można obliczyć jako:

np.var(matryca)

Odchylenie standardowe wektora można obliczyć jako:

np.std(matryca)

Dane wyjściowe powyższych poleceń na danej macierzy podano tutaj:

Transpozycja macierzy

Transpozycja to bardzo powszechna operacja, o której usłyszysz, gdy będziesz otoczony przez macierze. Transpozycja to tylko sposób na zamianę wartości kolumnowych i wierszowych macierzy. Należy pamiętać, że wektor nie może być transponowany jako wektor jest po prostu zbiorem wartości bez kategoryzacji tych wartości na wiersze i kolumny. Zwróć uwagę, że konwersja wektora wierszowego na wektor kolumnowy nie jest transpozycją (na podstawie definicji algebry liniowej, która jest poza zakresem tej lekcji).

Na razie spokój znajdziemy po prostu transponując matrycę. Dostęp do transpozycji macierzy za pomocą NumPy jest bardzo prosty:

macierz.T

Wynik powyższego polecenia na danej macierzy jest podany tutaj:

Tę samą operację można wykonać na wektorze wierszowym, aby przekonwertować go na wektor kolumnowy.

Spłaszczanie matrycy

Możemy przekształcić macierz w tablicę jednowymiarową, jeśli chcemy przetwarzać jej elementy w sposób liniowy. Można to zrobić za pomocą następującego fragmentu kodu:

matrix.flatten()

Wynik powyższego polecenia na danej macierzy jest podany tutaj:

Zauważ, że spłaszczona macierz jest tablicą jednowymiarową, po prostu liniową.

Obliczanie wartości własnych i wektorów własnych

Wektory własne są bardzo często używane w pakietach uczenia maszynowego. Tak więc, gdy funkcja przekształcenia liniowego jest przedstawiona jako macierz, to X, wektory własne są wektorami, które zmieniają się tylko w skali wektora, ale nie w jego kierunku. Możemy to powiedzieć:

Xv = γv

Tutaj X jest macierzą kwadratową, a γ zawiera wartości własne. Ponadto v zawiera wektory własne. Dzięki NumPy łatwo jest obliczyć wartości własne i wektory własne. Oto fragment kodu, w którym pokazujemy to samo:

e-wartości, wektory = np.linalg.eig(matryca)

Wynik powyższego polecenia na danej macierzy jest podany tutaj:

Produkty kropkowe wektorów

Iloczyny kropkowe wektorów to sposób mnożenia 2 wektorów. Mówi ci o ile wektorów jest w tym samym kierunku , w przeciwieństwie do iloczynu krzyżowego, który mówi przeciwnie, jak małe wektory są w tym samym kierunku (tzw. ortogonalne). Możemy obliczyć iloczyn skalarny dwóch wektorów, jak podano we fragmencie kodu tutaj:

a = np. tablica([3,5,6])
b = np. tablica([2. 3,piętnaście,1])

np. kropka(a, b)

Wynik powyższego polecenia na danych tablicach jest podany tutaj:

Dodawanie, odejmowanie i mnożenie macierzy

Dodawanie i odejmowanie wielu macierzy jest dość prostą operacją w macierzach. Można to zrobić na dwa sposoby. Spójrzmy na fragment kodu, aby wykonać te operacje. Aby to uprościć, użyjemy dwukrotnie tej samej macierzy:

np. dodaj(macierz, macierz)

Następnie można odjąć dwie macierze jako:

np.odejmuj(macierz, macierz)

Wynik powyższego polecenia na danej macierzy jest podany tutaj:

Zgodnie z oczekiwaniami, każdy z elementów w macierzy jest dodawany/odejmowany wraz z odpowiednim elementem. Mnożenie macierzy jest podobne do znajdowania iloczynu skalarnego, jak to zrobiliśmy wcześniej:

np. kropka(macierz, macierz)

Powyższy kod znajdzie prawdziwą wartość mnożenia dwóch macierzy, podaną jako:

matryca*matryca

Wynik powyższego polecenia na danej macierzy jest podany tutaj:

Wniosek

W tej lekcji przeszliśmy przez wiele operacji matematycznych związanych z wektorami, macierzami i tablicami, które są powszechnie używane w przetwarzaniu danych, statystyce opisowej i nauce o danych. Była to krótka lekcja obejmująca tylko najczęstsze i najważniejsze sekcje szerokiej gamy pojęć, ale te operacje powinny dać bardzo dobre wyobrażenie o tym, jakie wszystkie operacje można wykonać podczas pracy z tymi strukturami danych.

Podziel się swoją opinią na temat lekcji na Twitterze z @linuxhint oraz @sbmaggarwal (to ja!).