lo que sería la forma más rápida para combinar una lista de matrices numpy en una matriz si se conoce la longitud de la lista y el tamaño de las matrices, lo que es lo mismo ¿para todos?Fusionar una lista de matrices numpy en un array (rápido)
probé dos enfoques:
merged_array = array(list_of_arrays)
de Pythonic way to create a numpy array from a list of numpy arrays yvstack
A se puede ver vstack
es más rápido, pero por alguna razón la primera carrera toma tres tiempos más largos que el segundo. Supongo que esto causado por (faltante) preallocation. Entonces, ¿cómo puedo preasignar una matriz para vstack
? ¿O conoces un método más rápido?
Gracias!
[ACTUALIZACIÓN]
Quiero (25280, 320)
no (80, 320, 320)
lo que significa, merged_array = array(list_of_arrays)
no funcionará para mí. ¡Gracias Joris por señalar eso!
Salida:
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
Código:
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"
uso [ 'timeit'] (http://docs.python.org/library/timeit.html) para hacer pruebas de rendimiento simple en Python. Produce resultados más precisos. –
¿Qué dimensiones desea que tenga la matriz fusionada? Debido a '' first1'' es '' (80, 320, 320) '' y '' first2'' es '' (25,280, 320) '' – joris
@joris, gracias por señalarlo. Quiero el segundo, que fue mi enfoque inicial. Lo cambiaré en la pregunta. – Framester