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ść:
merged_array = array(list_of_arrays)
z Pythonic way to create a numpy array from a list of numpy arrays ivstack
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"
Użyj ['timeit'] (http://docs.python.org/library/timeit.html), aby wykonać proste testy wydajności w Pythonie. Daje dokładniejsze wyniki. –
Jakie wymiary ma mieć scalona tablica? Ponieważ '' first1'' to '' (80, 320, 320) '' i '' first2'' jest '' (25280, 320) '' – joris
@joris, dzięki za wskazanie tego. Chcę drugi, który był moim początkowym podejściem. Zmienię to w pytaniu. – Framester