2011-05-17 29 views
18

jaki byłby najszybszy sposób na scalenie listy numpy tablic w jedną tablicę, jeśli zna się długość listy i rozmiar tablic, która jest taka sama dla wszystkich?Scalanie listy numpy tablic w jedną tablicę (szybka)

Próbowałem dwóch podejść:

widać vstack jest szybsza, ale z jakiegoś powodu pierwsze uruchomienie trwa trzy razy dłużej niż drugi. Zakładam, że jest to spowodowane przez (brakujące) preallocation. Jak więc wstępnie utworzyć tablicę dla vstack? A może znasz szybszą metodę?

Dzięki!

[UPDATE]

Chcę (25280, 320) nie (80, 320, 320) co oznacza, merged_array = array(list_of_arrays) przyzwyczajenie praca dla mnie. Dziękuję Joris za wskazanie tego !!!

wyjściowa:

0.547468900681 s merged_array = array(first_list_of_arrays) 
0.547191858292 s merged_array = array(second_list_of_arrays) 
0.656183958054 s vstack first 
0.236850976944 s vstack second 

Kod:

import numpy 
import time 
width = 320 
height = 320 
n_matrices=80 

secondmatrices = list() 
for i in range(n_matrices): 
    temp = numpy.random.rand(height, width).astype(numpy.float32) 
    secondmatrices.append(numpy.round(temp*9)) 

firstmatrices = list() 
for i in range(n_matrices): 
    temp = numpy.random.rand(height, width).astype(numpy.float32) 
    firstmatrices.append(numpy.round(temp*9)) 


t1 = time.time() 
first1=numpy.array(firstmatrices) 
print time.time() - t1, "s merged_array = array(first_list_of_arrays)" 

t1 = time.time() 
second1=numpy.array(secondmatrices) 
print time.time() - t1, "s merged_array = array(second_list_of_arrays)" 

t1 = time.time() 
first2 = firstmatrices.pop() 
for i in range(len(firstmatrices)): 
    first2 = numpy.vstack((firstmatrices.pop(),first2)) 
print time.time() - t1, "s vstack first" 

t1 = time.time() 
second2 = secondmatrices.pop() 
for i in range(len(secondmatrices)): 
    second2 = numpy.vstack((secondmatrices.pop(),second2)) 

print time.time() - t1, "s vstack second" 
+2

Użyj ['timeit'] (http://docs.python.org/library/timeit.html), aby wykonać proste testy wydajności w Pythonie. Daje dokładniejsze wyniki. –

+2

Jakie wymiary ma mieć scalona tablica? Ponieważ '' first1'' to '' (80, 320, 320) '' i '' first2'' jest '' (25280, 320) '' – joris

+0

@joris, dzięki za wskazanie tego. Chcę drugi, który był moim początkowym podejściem. Zmienię to w pytaniu. – Framester

Odpowiedz

18

Masz 80 tablice 320x320? Więc prawdopodobnie chcesz użyć dstack:

first3 = numpy.dstack(firstmatrices) 

ta zwraca jeden 80x320x320 tablicę jak numpy.array(firstmatrices) robi:

timeit numpy.dstack(firstmatrices) 
10 loops, best of 3: 47.1 ms per loop 


timeit numpy.array(firstmatrices) 
1 loops, best of 3: 750 ms per loop 

Jeśli chcesz użyć vstack, zwróci się 25600x320 tablicy:

timeit numpy.vstack(firstmatrices) 
100 loops, best of 3: 18.2 ms per loop 
+0

Cześć eurmiro, przepraszam, moje pytanie było niejasne. Potrzebuję (25280, 320), a nie (80, 320, 320). Zobacz aktualizację mojego pytania. – Framester

+0

@Framester - ok, następnie zobacz moją aktualizację prostym 'vstack'. – eumiro

Powiązane problemy