Объединение списка массивов numpy в один массив (быстрый)
Какой бы самый быстрый способ объединить список массивов numpy в один массив, если знать длину списка и размер массивов, что одинаково для всех?
Я попробовал два подхода:
A вы можете видеть vstack
быстрее, но по какой-то причине первый запуск занимает три раза дольше, чем второй. Я предполагаю, что это вызвано (отсутствием) preallocation. Итак, как бы я выделил массив для vstack
? Или вы знаете более быстрый метод?
Спасибо!
[ОБНОВЛЕНИЕ]
Я хочу (25280, 320)
не (80, 320, 320)
, что означает, что merged_array = array(list_of_arrays)
не работает для меня. Спасибо Joris за то, что указали это!!!
Вывод:
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
Код:
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"
Ответы
Ответ 1
У вас есть 80 массивов 320x320? Поэтому вы, вероятно, захотите использовать dstack
:
first3 = numpy.dstack(firstmatrices)
Это возвращает один массив 80x320x320, как и numpy.array(firstmatrices)
делает:
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
Если вы хотите использовать vstack
, он вернет массив 25600x320:
timeit numpy.vstack(firstmatrices)
100 loops, best of 3: 18.2 ms per loop