Ich habe zwei einfache eindimensionale Arrays in NumPy . Ich sollte in der Lage sein, sie mit numpy.concatenate zu verketten . Aber ich bekomme diesen Fehler für den folgenden Code:
TypeError: Nur Arrays der Länge 1 können in Python-Skalare konvertiert werden
Code
import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)
Warum?
python
arrays
numpy
concatenation
numpy-ndarray
grosse Bandbreite
quelle
quelle
np.concatenat(..., axis)
. Wenn Sie sie vertikal stapeln möchten, verwenden Sienp.vstack
. Wenn Sie sie horizontal (in mehrere Arrays) stapeln möchten, verwenden Sienp.hstack
. (Wenn Sie sie in der Tiefe stapeln möchten, dh in der 3. Dimension, verwenden Sienp.dstack
). Beachten Sie, dass letztere Pandas ähnlich sindpd.concat
Antworten:
Die Zeile sollte sein:
Die Arrays, die Sie verketten möchten, müssen als Sequenz und nicht als separate Argumente übergeben werden.
Aus der NumPy-Dokumentation :
Es wurde versucht, Ihren
b
als Achsenparameter zu interpretieren , weshalb es sich beschwerte, dass es nicht in einen Skalar konvertiert werden konnte.quelle
numpy.concatenate(a1, a2, a3)
odernumpy.concatenate(*[a1, a2, a3])
wenn Sie es vorziehen, verwenden. Python ist so flüssig, dass sich der Unterschied eher kosmetisch als wesentlich anfühlt, aber es ist gut, wenn die API konsistent ist (z. B. wenn alle Numpy-Funktionen, die Argumentlisten mit variabler Länge verwenden, explizite Sequenzen erfordern).def concatx(*sequences, **kwargs)
. B. ). Es ist nicht ideal, da Sie die Keyword-Argumente in der Signatur auf diese Weise nicht explizit benennen können, aber es gibt Problemumgehungen.Es gibt verschiedene Möglichkeiten, 1D-Arrays zu verketten, z.
Alle diese Optionen sind für große Arrays gleich schnell. für kleine
concatenate
hat eine leichte Kante:Die Handlung wurde mit perfplot erstellt :
quelle
np.concatenate
. Sie massieren einfach die Eingabeliste auf verschiedene Arten vor der Hand.np.stack
Fügt beispielsweise allen Eingabearrays eine zusätzliche Dimension hinzu. Schauen Sie sich ihren Quellcode an. Nurconcatenate
wird kompiliert.np.concatenate
Kopien der Eingaben erstellt werden. Diese Speicher- und Zeitkosten überwiegen dann die Zeit, die für das "Massieren" der Eingabe aufgewendet wurde.Der erste Parameter
concatenate
sollte selbst eine Folge von zu verkettenden Arrays sein :quelle
Eine Alternative besteht darin, die Kurzform "verketten" zu verwenden, die entweder "r _ [...]" oder "c _ [...]" lautet, wie im folgenden Beispielcode gezeigt (siehe http://wiki.scipy.org) / NumPy_for_Matlab_Users für zusätzliche Informationen):
Was in ... endet:
quelle
vector_b = [1,1,1,1] #short form of "array"
, das ist einfach nicht wahr. vector_b ist ein Standard-Python-Listentyp. Numpy ist jedoch ziemlich gut darin, Sequenzen zu akzeptieren, anstatt alle Eingaben zu numpy.array-Typen zu zwingen.Hier sind weitere Ansätze, dies zu tun , indem Sie
numpy.ravel()
,numpy.array()
, unter Verwendung der Tatsache , dass 1D - Arrays in einfache Elemente ausgepackt werden können:quelle
Einige weitere Fakten aus den numpy docs :
Mit Syntax als
numpy.concatenate((a1, a2, ...), axis=0, out=None)
Achse = 0 für zeilenweise Verkettung Achse = 1 für spaltenweise Verkettung
Ich hoffe, es hilft !
quelle