Jakie są zalety NumPy nad zwykłymi listami Pythona?

Jakie są zalety NumPy nad zwykłymi listami Pythona?

Mam około 100 serii rynków finansowych i zamierzam stworzyć tablicę sześcianów o wymiarach 100x100x100 = 1 milion komórek. Będę regresował (3-zmienną) każde X Z Każdym y i z, aby wypełnić tablicę standardowymi błędami.

Słyszałem, że dla" dużych macierzy " powinienem używać NumPy w przeciwieństwie do list Pythona, ze względu na wydajność i skalowalność. Rzecz w tym, że znam listy Pythona i wydają się pracować dla mnie.

Jakie będą korzyści, jeśli przeniosę się do NumPy?

A gdybym miał serię 1000 (czyli miliard komórek zmiennoprzecinkowych w sześcianie)?

Author: kmario23, 2009-06-14

5 answers

Tablice NumPy są bardziej kompaktowe niż listy Pythona-lista list, jak opisujesz, w Pythonie zajmuje co najmniej 20 MB, podczas gdy tablica NumPy 3D z pojedynczą precyzją pływaków w komórkach zmieściłaby się w 4 MB. Dostęp do odczytu i zapisu elementów jest również szybszy dzięki NumPy.

Może nie zależy ci tak bardzo na milionie komórek, ale zdecydowanie na miliard komórek - żadne podejście nie zmieściłoby się w architekturze 32-bitowej, ale z 64-bitowymi kompilacjami NumPy uciekłby z 4 GB lub tak, Python sam potrzebuje co najmniej o 12 GB ( wiele wskaźników, które dwukrotnie w rozmiarze) - znacznie droższy kawałek sprzętu!

Różnica wynika głównie z "indirectness" - lista Pythona jest tablicą wskaźników do obiektów Pythona, co najmniej 4 bajty na wskaźnik plus 16 bajtów dla nawet najmniejszego obiektu Pythona (4 dla wskaźnika typu, 4 dla liczby odniesień, 4 dla wartości -- a alokatory pamięci zaokrąglają się do 16). Tablica NumPy jest tablicą jednorodnych wartości -- liczby pojedynczej precyzji zajmują po 4 bajty każda, liczby podwójnej precyzji po 8 bajtów. Mniej elastyczne, ale płacisz znacznie za elastyczność standardowych list Pythona!

 762
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-29 11:55:46

NumPy jest nie tylko bardziej wydajny, ale także wygodniejszy. Dostajesz za darmo wiele operacji wektorowych i macierzowych, które czasami pozwalają uniknąć niepotrzebnej pracy. I są one również skutecznie realizowane.

Na przykład możesz odczytać swoją kostkę bezpośrednio z pliku do tablicy:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

Suma wzdłuż drugiego wymiaru:

s = x.sum(axis=1)

Znajdź, które komórki są powyżej progu:

(x > 0.5).nonzero()

Usuń każdy parzysty kawałek wzdłuż trzeciego wymiar:

x[:, :, ::2]

Również wiele użytecznych bibliotek działa z tablicami NumPy. Na przykład biblioteki analizy statystycznej i wizualizacji.

Nawet jeśli nie masz problemów z wydajnością, nauka NumPy jest warta wysiłku.

 242
Author: Roberto Bonvallet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 01:53:30

Alex wspomniał o wydajności pamięci, a Roberto o wygodie, i to są dobre punkty. Jeśli chodzi o kilka pomysłów, wspomnę o Prędkości i funkcjonalności .

Funkcjonalność: masz wiele wbudowanych w NumPy, FFTs, sploty, szybkie wyszukiwanie, podstawowe statystyki, algebrę liniową, histogramy itp. I naprawdę, kto może żyć bez FFT?

Speed: Oto test na robienie sumy nad listą i tablicą NumPy, pokazujący, że suma na tablicy NumPy jest 10x szybciej ( w tym teście-przebieg może się różnić).

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

Które na moich systemach (podczas uruchamiania backupu) daje:

numpy: 3.004e-05
list:  5.363e-04
 115
Author: tom10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 18:18:30

Oto fajna odpowiedź z FAQ na scipy.org strona internetowa :

Jakie zalety oferują tablice NumPy nad (zagnieżdżonymi) listami Pythona?

Listy Pythona są wydajnymi kontenerami ogólnego przeznaczenia. Wspierają (dość) skuteczne wstawianie, usuwanie, dodawanie i łączenie, a składanie list w Pythonie ułatwia ich konstruowanie i manipulować. Mają jednak pewne ograniczenia: nie obsługują "wektoryzowane" operacje takie jak dodawanie i mnożenie elementów, a fakt, że mogą zawierać przedmioty różnego typu oznacza że Python musi przechowywać informacje o typie dla każdego elementu i musi wykonaj kod wysyłający Typ podczas pracy na każdym elemencie. To oznacza to również, że bardzo niewiele operacji listowych może być wykonanych przez wydajne pętle C – każda iteracja wymagałaby kontroli typu i innych Księgowość API Pythona.

 47
Author: Eliezer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 15:17:38

Wszystkie podkreśliły prawie wszystkie główne różnice między tablicami numpy i listą Pythona, powiem tylko o nich tutaj:

  1. Tablice Numpy mają stały rozmiar podczas tworzenia, w przeciwieństwie do list Pythona (które mogą rosnąć dynamicznie). Zmiana rozmiaru ndarray spowoduje utworzenie nowej tablicy i usunięcie oryginału.

  2. Elementy tablicy Numpy muszą być tego samego typu danych (możemy mieć również Typ heterogeniczny, ale to nie pozwoli operacje matematyczne) i tym samym będzie taka sama wielkość w pamięci

  3. Tablice Numpy są ułatwione postępy matematyczne i inne rodzaje operacji na dużej liczbie danych. Zazwyczaj takie operacje są wykonywane bardziej efektywnie i z mniejszą ilością kodu niż jest to możliwe przy użyciu Pythonów zbudowanych w sekwencjach

 12
Author: Parvez Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-05 12:46:45