Concatenación de dos matrices NumPy unidimensionales


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

TypeError: solo los arrays 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é?

Author: Peter Mortensen, 2012-02-11

4 answers

La línea debe ser:

numpy.concatenate([a,b])

Los arrays que desea concatenar deben pasarse como una secuencia, no como argumentos separados.

De la documentación NumPy :

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

Une una secuencia de matrices.

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

 233
Author: Winston Ewert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-18 14:03:31

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

numpy.concatenate((a,b)) # Note the extra parentheses.
 22
Author: Gabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-22 09:38:00

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 arreglos grandes; para arreglos pequeños, concatenate tiene un ligero borde:

introduzca la descripción de la imagen aquí

La trama se creó 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,
    )
 10
Author: Nico Schlömer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 12:00:42

Una alternativa es usar la forma corta de "concatenar" que es "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)

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.]]
 8
Author: Semjon Mössinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-24 06:46:30