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?
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.
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.
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:
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,
)
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.]]