2012-04-12 22 views
22

Chcę móc "budować" tablicę numpy w locie, nie wiem z góry wielkości tej tablicy.Inicjalizacja tablicy numpy o nieznanej długości

Na przykład chcę zrobić coś takiego:

a= np.array() 
for x in y: 
    a.append(x) 

Które spowodowałoby zawierających wszystkich elementów x, oczywiście jest to banalna odpowiedź. Jestem ciekawy, czy to możliwe?

+2

Co może być bardziej efektywnym podejściem, należy przydzielić dużą tablicę i podwoić jej wielkość za każdym razem, gdy osiągniesz pojemność. – wim

Odpowiedz

48

Utwórz listę Python i przekonwertować do tablicy numpy. To zajmuje zamortyzowany czas O (1) na dodatek + O (n) dla konwersji do macierzy, dla sumy O (n).

a = [] 
    for x in y: 
     a.append(x) 
    a = np.array(a) 
+0

Albo jeszcze lepiej: 'a = np.array ([x dla x in y])'; lub po prostu 'a = np.array (list (y))' –

8

Można to zrobić:

a = np.array([]) 
for x in y: 
    a = np.append(a, x) 
+5

To zajmuje liniowy czas na dodatek. –

+6

To podejście kopiuje tablicę w każdym dodatku, który jest O (suma (zakres (n))). Na moim laptopie metoda ta była 42 razy wolniejsza niż metoda larsmana: budowanie listy za pomocą metody larsmana zajmuje mi dokładnie 1000 pętli, najlepiej 3: 1,53 ms na pętlę. Po tej metodzie dokładnie pobiera mi 10 pętli, najlepiej 3: 64,8 ms na pętlę. –

1

dla potomności, myślę, że to jest szybsze:

a = np.array([np.array(list()) for _ in y]) 

Możesz nawet być w stanie przejść w generatorze (czyli [] ->()), w którym to przypadku lista wewnętrzna jest nigdy w pełni przechowywane w pamięci.


odpowiedzi na komentarz poniżej:

>>> import numpy as np 
>>> y = range(10) 
>>> a = np.array([np.array(list) for _ in y]) 
>>> a 
array([array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object), 
     array(<type 'list'>, dtype=object)], dtype=object) 
+0

Wprowadziłem zmianę tutaj: lista (_) i która działała świetnie – javadba

+0

Aby być czystym @javadba, nie musisz tego robić - jestem na pewno jest jakiś Pythonistas, który by się obraził :) – BenDundee

+0

To nie jest kwestia stylu. bez listy (_) to nawet nie działa w końcu dla przypadku mam, że y jest samą tablicą – javadba

0
a = np.empty(0) 
for x in y: 
    a = np.append(a, x) 
4

Ponieważ Y jest iterable I naprawdę nie rozumiem, dlaczego rozmowy dołączyć:

a = np.array(list(y)) 

zrobi i to znacznie szybciej:

import timeit 

print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))') 
# 23.952975494633154 

print timeit.timeit("""li=[] 
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))') 
# 189.3826994248866 
Powiązane problemy