only index converted concatenate array python arrays numpy concatenation

python - index - numpy stack



Concatenar dos matrices NumPy unidimensionales (4)

Tengo dos matrices unidimensionales simples en NumPy . Debería ser capaz de concatenarlos usando numpy.concatenate . Pero obtengo este error para el siguiente código:

TypeError: solo las matrices de longitud-1 se pueden convertir a escalares de Python

Código

import numpy a = numpy.array([1, 2, 3]) b = numpy.array([5, 6]) numpy.concatenate(a, b)

¿Por qué?


El primer parámetro para concatenate debería ser una secuencia de matrices para concatenar:

numpy.concatenate((a,b)) # Note the extra parentheses.


Hay varias posibilidades para concatenar matrices 1D, por ejemplo,

numpy.r_[a, a], numpy.stack([a, a]).reshape(-1), numpy.hstack([a, a]), numpy.concatenate([a, a])

Todas esas opciones son igualmente rápidas para matrices grandes; para los pequeños, concatenate tiene una ligera ventaja:

La trama fue creada con perfplot :

import numpy import perfplot perfplot.show( setup=lambda n: numpy.random.rand(n), kernels=[ lambda a: numpy.r_[a, a], lambda a: numpy.stack([a, a]).reshape(-1), lambda a: numpy.hstack([a, a]), lambda a: numpy.concatenate([a, a]) ], labels=[''r_'', ''stack+reshape'', ''hstack'', ''concatenate''], n_range=[2**k for k in range(19)], xlabel=''len(a)'', logx=True, logy=True, )


La línea debería ser:

numpy.concatenate([a,b])

Las matrices que desea concatenar deben pasarse como una secuencia, no como argumentos separados.

De la numpy.concatenate :

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

Únete a una secuencia de matrices juntas.

Intentaba interpretar tu b como el parámetro del eje, por lo que se quejó de que no podía convertirlo en escalar.


Una alternativa es usar la forma abreviada de "concatenar" que sea "r _ [...]" o "c _ [...]" como se muestra en el código de ejemplo debajo (ver http://wiki.scipy.org/NumPy_for_Matlab_Users para información adicional):

%pylab vector_a = r_[0.:10.] #short form of "arange" vector_b = array([1,1,1,1]) vector_c = r_[vector_a,vector_b] print vector_a print vector_b print vector_c, ''/n/n'' a = ones((3,4))*4 print a, ''/n'' c = array([1,1,1]) b = c_[a,c] print b, ''/n/n'' a = ones((4,3))*4 print a, ''/n'' c = array([[1,1,1]]) b = r_[a,c] print b print type(vector_b)

Lo que resulta en:

[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] [1 1 1 1] [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 1. 1. 1. 1.] [[ 4. 4. 4. 4.] [ 4. 4. 4. 4.] [ 4. 4. 4. 4.]] [[ 4. 4. 4. 4. 1.] [ 4. 4. 4. 4. 1.] [ 4. 4. 4. 4. 1.]] [[ 4. 4. 4.] [ 4. 4. 4.] [ 4. 4. 4.] [ 4. 4. 4.]] [[ 4. 4. 4.] [ 4. 4. 4.] [ 4. 4. 4.] [ 4. 4. 4.] [ 1. 1. 1.]]