multiplicar - transpuesta de una matriz en python numpy
Fusionar una lista de matrices numpy en una matriz(rĂ¡pido) (1)
¿Cuál sería la forma más rápida de combinar una lista de matrices numpy en una matriz si uno conoce la longitud de la lista y el tamaño de las matrices, que es la misma para todas?
Probé dos enfoques:
merged_array = array(list_of_arrays)
de la forma Pythonic para crear una matriz numpy a partir de una lista de matrices numpy yvstack
A se puede ver que vstack
es más rápido, pero por alguna razón, la primera ejecución es tres veces más larga que la segunda. Supongo que esto es causado por (falta) preallocation . Entonces, ¿cómo preasignar una matriz para vstack
? ¿O conoces un método más rápido?
¡Gracias!
[ACTUALIZAR]
Quiero (25280, 320)
no (80, 320, 320)
que significa que 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"
Tienes 80 matrices 320x320? Así que probablemente quieras usar dstack
:
first3 = numpy.dstack(firstmatrices)
Esto devuelve una matriz de 80x320x320 como lo hace 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
Si desea usar vstack
, devolverá una matriz de 25600x320:
timeit numpy.vstack(firstmatrices)
100 loops, best of 3: 18.2 ms per loop