Concaténer deux tableaux NumPy unidimensionnels

J'ai deux simples tableaux unidimensionnels dans NumPy. Je devrais être capable de les concaténer en utilisant numpy.concaténer. Mais je reçois cette erreur pour le code ci-dessous:

TypeError: seuls les tableaux length-1 peuvent être convertis en scalaires Python

Code

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

Pourquoi?

161
demandé sur Peter Mortensen 2012-02-11 05:11:06

4 réponses

La ligne devrait être:

numpy.concatenate([a,b])

Les tableaux que vous voulez concaténer doivent être transmis en tant que séquence, pas en tant qu'arguments séparés.

À partir de la documentation NumPy :

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

Joindre une séquence de tableaux.

Il essayait d'interpréter votre b comme le paramètre axis, c'est pourquoi il s'est plaint de ne pas pouvoir le convertir en scalaire.

233
répondu Winston Ewert 2014-04-18 14:03:31

Le premier paramètre à concatenate devrait lui-même être une séquence de tableaux {[4] } à concaténer:

numpy.concatenate((a,b)) # Note the extra parentheses.
22
répondu Gabe 2013-12-22 09:38:00

Il existe plusieurs possibilités pour concaténer des tableaux 1D, par exemple

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

Toutes ces options sont également rapides pour les grands tableaux; pour les petits, concatenate a un léger bord:

entrez la description de l'image ici

L'intrigue a été créée avec 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
répondu Nico Schlömer 2017-08-15 12:00:42

Une alternative est d'utiliser la forme abrégée de "concaténer" qui est soit "r_[...]" ou "c_[...] "comme indiqué dans l'exemple de code ci-dessous (voir http://wiki.scipy.org/NumPy_for_Matlab_Users pour plus d'Informations):

%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)

Qui se traduit par:

[ 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
répondu Semjon Mössinger 2013-12-24 06:46:30