J'ai deux tableaux simples à une dimension dans NumPy . Je devrais pouvoir les concaténer en utilisant numpy.concatenate . Mais je reçois cette erreur pour le code ci-dessous:
TypeError: seuls les tableaux de longueur 1 peuvent être convertis en scalaires Python.
import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)
Pourquoi?
La ligne devrait être:
numpy.concatenate([a,b])
Les tableaux que vous souhaitez concaténer doivent être transmis sous forme de séquence et non sous forme d'arguments séparés.
De la documentation NumPy :
numpy.concatenate((a1, a2, ...), axis=0)
Joignez une séquence de tableaux ensemble.
Il essayait d'interpréter votre b
comme paramètre d'axe. C'est pourquoi il s'est plaint de ne pas pouvoir le convertir en scalaire.
Le premier paramètre de concatenate
devrait lui-même être un séquence de tableaux à 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 tableaux de grande taille; pour les plus petits, concatenate
a une légère arête:
L'intrigue a été créée avec perfplot :
import numpy
import perfplot
perfplot.save(
"o.png",
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 consiste à 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)
Ce qui résulte 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.]]
Voici d'autres approches pour le faire en utilisant numpy.ravel()
, numpy.array()
, en utilisant le fait que les tableaux 1D peuvent être décompressés en éléments simples:
# we'll utilize the concept of unpacking
In [15]: (*a, *b)
Out[15]: (1, 2, 3, 5, 6)
# using `numpy.ravel()`
In [14]: np.ravel((*a, *b))
Out[14]: array([1, 2, 3, 5, 6])
# wrap the unpacked elements in `numpy.array()`
In [16]: np.array((*a, *b))
Out[16]: array([1, 2, 3, 5, 6])