Czy istnieje sposób na zainicjowanie tablicy numpy kształtu i dodanie do niej? Wyjaśnię, czego potrzebuję, na przykładzie listy. Jeśli chcę stworzyć listę obiektów generowanych w pętli, mogę:
a = []
for i in range(5):
a.append(i)
Chcę zrobić coś podobnego z tablicą numpy. Wiem o vstack, concatenate itp. Jednak wydaje się, że wymagają one dwóch tablic numpy jako danych wejściowych. Potrzebuję:
big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
array i of shape = (2,4) created.
add to big_array
big_array
Powinny mieć kształt (10,4)
. Jak to zrobić?
EDYTOWAĆ:
Chcę dodać następujące wyjaśnienie. Mam świadomość, że potrafię to zdefiniować, big_array = numpy.zeros((10,4))
a następnie wypełnić. Wymaga to jednak wcześniejszego określenia rozmiaru tablicy big_array. W tym przypadku znam rozmiar, ale co jeśli nie? Kiedy używamy .append
funkcji do rozszerzania listy w Pythonie, nie musimy z góry znać jej ostatecznego rozmiaru. Zastanawiam się, czy istnieje coś podobnego do tworzenia większej tablicy z mniejszych tablic, zaczynając od pustej tablicy.
[i for i in range(5)]
. (Równoważnie:list(range(5))
chociaż jest to wymyślony przykład.)x = numpy.array()
robilibyśmy to z listąy = []
; ale to nie zadziałałoOdpowiedzi:
lub
lub
Jednak mentalność, w której konstruujemy tablicę przez dołączanie elementów do listy, nie jest zbytnio używana w numpy, ponieważ jest mniej wydajna (typy danych numpy są znacznie bliższe bazowym tablicom C). Zamiast tego należy wstępnie przydzielić tablicę do wymaganego rozmiaru, a następnie wypełnić wiersze. Możesz jednak użyć,
numpy.append
jeśli musisz.źródło
append
w numpy. Tyle, że mniej efektywne jest nieprzydzielanie wstępne (w tym przypadku znacznie mniej wydajne, ponieważappend
kopiowanie całej tablicy za każdym razem), więc nie jest to standardowa technika.np.empty
tablicy jest wypełniona wartościami? A co z pozostałymi „pustymi” przedmiotami?np.concatenate()
) można zainicjować z:np.empty((0, some_width))
. 0, więc twoja pierwsza tablica nie będzie śmieci.Sposób, w jaki zwykle to robię, polega na utworzeniu zwykłej listy, a następnie dołączeniu do niej swoich rzeczy i ostatecznie przekształceniu listy w tablicę numpy w następujący sposób:
oczywiście twój ostateczny obiekt zajmuje dwa razy więcej miejsca w pamięci na etapie tworzenia, ale dołączanie do listy Pythona jest bardzo szybkie, a tworzenie również za pomocą np.array ().
źródło
Wprowadzony w numpy 1.8:
Przykłady:
źródło
Tablica analogowa dla Pythona
jest:
źródło
empty((0))
inicjalizuje tablicę numpy.numpy.fromiter()
to czego szukasz:Działa również z wyrażeniami generatora, np .:
Jeśli znasz wcześniej długość tablicy, możesz określić ją za pomocą opcjonalnego argumentu „count”.
źródło
Podczas wykonywania obliczeń tablicowych chcesz w jak największym stopniu unikać jawnych pętli, ponieważ zmniejsza to wzrost szybkości wynikający z tej formy przetwarzania. Istnieje wiele sposobów inicjalizacji tablicy numpy. Jeśli chcesz, aby był wypełniony zerami, zrób tak, jak powiedziała Katrielalex:
big_array = numpy.zeros((10,4))
EDYCJA: Jakiego rodzaju sekwencję tworzysz? Powinieneś sprawdzić różne funkcje numpy, które tworzą tablice, takie jak
numpy.linspace(start, stop, size)
(równo rozmieszczona liczba) lubnumpy.arange(start, stop, inc)
. Tam, gdzie to możliwe, te funkcje spowodują, że tablice będą znacznie szybsze niż wykonywanie tej samej pracy w jawnych pętlachźródło
W pierwszym przykładzie tablicy użyj
Aby zainicjować big_array, użyj
Zakłada się, że chcesz zainicjalizowaćzerami, co jest dość typowe, ale istnieje wiele innych sposobów inicjalizacji tablicy w numpy .
Edycja: Jeśli nie znasz wcześniej rozmiaru big_array, ogólnie najlepiej jest najpierw zbudować listę Pythona za pomocą append, a kiedy masz wszystko zebrane na liście, przekonwertuj ją na tablicę numpy za pomocą
numpy.array(mylist)
. Powodem tego jest to, że listy mają rosnąć bardzo wydajnie i szybko, podczas gdy numpy.concatenate byłby bardzo nieefektywny, ponieważ tablice numpy nie zmieniają łatwo rozmiaru. Ale kiedy wszystko jest zebrane na liście i znasz ostateczny rozmiar tablicy, tablicę numpy można skutecznie skonstruować.źródło
Aby zainicjować tablicę numpy z określoną macierzą:
wynik:
źródło
Ilekroć znajdujesz się w następującej sytuacji:
i chcesz czegoś podobnego w numpy, kilka poprzednich odpowiedzi wskazywało sposoby na zrobienie tego, ale jak @katrielalex wskazał, te metody nie są wydajne. Skutecznym sposobem jest utworzenie długiej listy, a następnie przekształcenie jej w żądany sposób po utworzeniu długiej listy. Na przykład, powiedzmy, że czytam kilka wierszy z pliku, a każdy wiersz ma listę liczb i chcę zbudować tablicę numpy kształtu (liczba odczytanych wierszy, długość wektora w każdym wierszu). Oto jak zrobiłbym to wydajniej:
źródło
Zdaję sobie sprawę, że to trochę za późno, ale nie zauważyłem żadnej innej odpowiedzi wspominającej o indeksowaniu do pustej tablicy:
W ten sposób całą tablicę wyników przydzielasz wstępnie za pomocą
numpy.empty
przydzielasz i wypełniasz wiersze w trakcie, używając przypisania indeksowanego.Całkowicie bezpieczne jest dokonanie wstępnej alokacji
empty
zamiastzeros
w podanym przykładzie, ponieważ gwarantujesz, że cała tablica zostanie wypełniona wygenerowanymi fragmentami.źródło
Proponuję najpierw zdefiniować kształt. Następnie wykonaj iterację, aby wstawić wartości.
źródło
Może coś takiego będzie pasowało do Twoich potrzeb.
Który daje następujący wynik
źródło