2011-07-18 21 views
8

Tengo dos matrices de 20x100x3 NumPy que quiero combinar en una matriz de 40 x 100 x 3, es decir, simplemente agregue más líneas a la matriz. Estoy confundido por la función que quiero: ¿es vstack, hstack, column_stack o tal vez algo más?Combinación de matrices de NumPy

Respuesta

23

Creo que es vstack desea

p=array_2 
q=array_2 
p=numpy.vstack([p,q]) 
+0

no estoy seguro de por qué tu respuesta no apareció cuando visité por primera vez la página. +1 para sugerir vstack primero. – JoshAdel

+0

Tenga en cuenta que la documentación sugiere utilizar 'stack' o' concatenar' hoy en día y que vstack solo es compatible con compatibilidad retroactiva, consulte: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/ numpy.vstack.html – NOhs

13

Una de las mejores formas de aprender está experimentando, pero yo diría que desea np.vstack aunque hay otras maneras de hacer la misma cosa:

a = np.ones((20,100,3)) 
b = np.vstack((a,a)) 

print b.shape # (40,100,3) 

o

b = np.concatenate((a,a),axis=0) 

EDITAR

Así como una nota, en mi máquina para las matrices de tamaño en cuestión de la OP, considero que np.concatenate es de aproximadamente 2 veces más rápido que np.vstack

In [172]: a = np.random.normal(size=(20,100,3)) 

In [173]: c = np.random.normal(size=(20,100,3)) 

In [174]: %timeit b = np.concatenate((a,c),axis=0) 
100000 loops, best of 3: 13.3 us per loop 

In [175]: %timeit b = np.vstack((a,c)) 
10000 loops, best of 3: 26.1 us per loop 
+0

extraño, pero gracias y ahora puedo dejar mi primer comentario. – Giltech

+0

Puedo ser, ser estúpido aquí, ya que no he usado mucho tiempo, pero ¿no se concatenan 10x tantos bucles? – Giltech

+1

@Giltech, mientras timeit usa 10x más bucles para comparar 'np.concatenate' (parece elegir esto automáticamente), el número importante aquí es el tiempo por ciclo – JoshAdel

9

Podría valer la pena mencionar que

np.concatenate((a1, a2, ...), axis=0) 

es la forma general y vstack y hstack son casos específicos. Me resulta más fácil saber qué dimensión quiero apilar y proporcionar eso como argumento para np.concatenate.

3

Por cierto, también hay r_:

>>> from scipy import * 
>>> a = rand(20,100,3) 
>>> b = rand(20,100,3) 
>>> a.shape 
(20, 100, 3) 
>>> b.shape 
(20, 100, 3) 
>>> r_[a,b].shape 
(40, 100, 3) 
>>> (r_[a,b] == vstack([a,b])).all() 
True 
4

probé un poco de referencia entre r_ y vstack y el resultado es muy interesante:

import numpy as np 

NCOLS = 10 
NROWS = 2 
NMATRICES = 10000 

def mergeR(matrices): 
    result = np.zeros([0, NCOLS]) 

    for m in matrices: 
     result = np.r_[ result, m] 

def mergeVstack(matrices): 
    result = np.vstack(matrices) 

def main(): 
    matrices = tuple(np.random.random([NROWS, NCOLS]) for i in xrange(NMATRICES)) 
    mergeR(matrices) 
    mergeVstack(matrices) 

    return 0 

if __name__ == '__main__': 
    main() 

Entonces me encontré con perfilador:

python -m cProfile -s cumulative np_merge_benchmark.py 

y los resultados:

ncalls tottime percall cumtime percall filename:lineno(function) 
... 
    1 0.579 0.579 4.139 4.139 np_merge_benchmark.py:21(mergeR) 
... 
    1 0.000 0.000 0.054 0.054 np_merge_benchmark.py:27(mergeVstack) 

Así que ¡la manera de la vstack es 77 veces más rápida!