J'ai deux tableaux unidimensionnels simples dans NumPy . Je devrais pouvoir les concaténer en utilisant numpy.concatenate . Mais j'obtiens cette erreur pour le code ci-dessous:
TypeError: seuls les tableaux de longueur 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?
python
arrays
numpy
concatenation
numpy-ndarray
bande passante élevée
la source
la source
np.concatenat(..., axis)
. Si vous souhaitez les empiler verticalement, utiliseznp.vstack
. Si vous souhaitez les empiler (en plusieurs tableaux) horizontalement, utiliseznp.hstack
. (Si vous voulez les empiler en profondeur, c'est-à-dire la 3ème dimension, utiliseznp.dstack
). Notez que ces derniers sont similaires aux pandaspd.concat
Réponses:
La ligne doit être:
Les tableaux que vous souhaitez concaténer doivent être transmis sous forme de séquence, et non sous forme d'arguments distincts.
De la documentation NumPy :
Il essayait d'interpréter votre
b
comme paramètre d'axe, c'est pourquoi il se plaignait de ne pas pouvoir le convertir en scalaire.la source
numpy.concatenate(a1, a2, a3)
ounumpy.concatenate(*[a1, a2, a3])
si vous préférez. Python est suffisamment fluide pour que la différence finisse par être plus esthétique que substantielle, mais c'est bien lorsque l'API est cohérente (par exemple, si toutes les fonctions numpy qui prennent des listes d'arguments de longueur variable nécessitent des séquences explicites).def concatx(*sequences, **kwargs)
). Ce n'est pas idéal car vous ne pouvez pas sembler nommer explicitement le mot-clé args dans la signature, mais il existe des solutions de contournement.Il existe plusieurs possibilités de concaténation de tableaux 1D, par exemple,
Toutes ces options sont également rapides pour les grands tableaux; pour les petits,
concatenate
a un léger avantage:L'intrigue a été créée avec perfplot :
la source
np.concatenate
. Ils massent simplement la liste d'entrée de différentes manières avant la main.np.stack
par exemple, ajoute une dimension supplémentaire à tous les tableaux d'entrée. Regardez leur code source. Seulconcatenate
est compilé.np.concatenate
fait des copies des entrées. Ce coût en mémoire et en temps l'emporte alors sur le temps passé à «masser» l'entrée.Le premier paramètre à
concatenate
lui-même devrait être une séquence de tableaux à concaténer:la source
Une alternative est d'utiliser la forme courte 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):
Ce qui se traduit par:
la source
vector_b = [1,1,1,1] #short form of "array"
, ce n'est tout simplement pas vrai. vector_b sera un type de liste Python standard. Numpy est cependant assez bon pour accepter des séquences au lieu de forcer toutes les entrées à être de type numpy.array.Voici des approches plus pour le faire en utilisant
numpy.ravel()
,numpy.array()
, en utilisant le fait que les tableaux 1D peut être décompressé en éléments simples:la source
Quelques faits supplémentaires à partir des documents numpy :
Avec la syntaxe as
numpy.concatenate((a1, a2, ...), axis=0, out=None)
axe = 0 pour la concaténation en ligne axe = 1 pour la concaténation en colonne
J'espère que ça aide!
la source