Wie fügt man einem Numpy-Array Zeilen hinzu?
Ich habe ein Array A:
A = array([[0, 1, 2], [0, 2, 0]])
Ich möchte diesem Array Zeilen aus einem anderen Array X hinzufügen, wenn das erste Element jeder Zeile in X eine bestimmte Bedingung erfüllt.
Numpy Arrays haben keine Methode, die wie Listen angehängt wird, oder so scheint es.
Wenn A und X Listen wären, würde ich nur Folgendes tun:
for i in X:
if i[0] < 3:
A.append(i)
Gibt es eine numpythonische Möglichkeit, das Äquivalent zu tun?
Danke, S ;-)
Antworten:
Was ist
X
? Wenn es sich um ein 2D-Array handelt, wie können Sie dann seine Zeile mit einer Zahl vergleichen :i < 3
?BEARBEITEN nach dem Kommentar von OP:
Fügen Sie
A
allen Zeilen hinzu, vonX
denen aus das erste Element stammt< 3
:quelle
A
. Für kleine Probleme wie in dieser Antwort ist dies natürlich kein Problem, aber für große Datenmengen kann es problematischer sein.Nun, du kannst das tun:
quelle
Da diese Frage vor 7 Jahren gestellt wurde, mache ich in der neuesten Version, die ich verwende, Numpy Version 1.13 und Python3, dasselbe mit dem Hinzufügen einer Zeile zu einer Matrix. Denken Sie daran , dem zweiten Argument eine doppelte Klammer hinzuzufügen. Andernfalls wird ein Dimensionsfehler ausgelöst.
Hier füge ich Matrix A hinzu
mit einer Reihe
gleiche Verwendung in
np.r_
Nur für jemanden, der interessiert ist, wenn Sie eine Spalte hinzufügen möchten,
array = np.c_[A,np.zeros(#A's row size)]
Befolgen Sie die Anweisungen in Matrix A und fügen Sie eine Spalte hinzu
quelle
Sie können dies auch tun:
quelle
np.concatenate((A,newrow), axis=0)
1.12.1
(und in Python 3) scheint es, als würde versucht, einen Vektor mit einer Matrix zu verkettenValueError: all the input arrays must have same number of dimensions
. Es sieht so aus, als ob der Vektor explizit in einen Spalten- oder Zeilenvektor umgewandelt werden soll, bevor er bereit ist, ihn zu verketten.newrow = [[1,2,3]]
Wenn nach jeder Zeile keine Berechnungen erforderlich sind, können Sie Zeilen in Python viel schneller hinzufügen und dann in numpy konvertieren. Hier sind Timing-Tests mit Python 3.6 vs. Numpy 1.14, bei denen nacheinander 100 Zeilen hinzugefügt werden:
Die einfache Lösung für die ursprüngliche Frage von vor sieben Jahren besteht darin, mit vstack () eine neue Zeile hinzuzufügen, nachdem die Zeile in ein numpy-Array konvertiert wurde. Eine realistischere Lösung sollte jedoch die schlechte Leistung von vstack unter diesen Umständen berücksichtigen. Wenn Sie nicht nach jedem Hinzufügen eine Datenanalyse für das Array ausführen müssen, ist es besser, die neuen Zeilen in eine Python-Liste von Zeilen (eigentlich eine Liste von Listen) zu puffern und sie als Gruppe zum numpy-Array hinzuzufügen Verwenden Sie vstack (), bevor Sie eine Datenanalyse durchführen.
quelle
quelle
Wenn Sie die Konstruktion in einer einzigen Operation ausführen können, ist so etwas wie die Antwort vstack-with-phantasie-indexing ein guter Ansatz. Wenn Ihr Zustand jedoch komplizierter ist oder Ihre Zeilen im laufenden Betrieb eingehen, möchten Sie möglicherweise das Array vergrößern. Tatsächlich besteht die numpythonische Methode, um so etwas zu tun - ein Array dynamisch zu vergrößern - darin, eine Liste dynamisch zu vergrößern:
Listen sind stark für diese Art von Zugriffsmustern optimiert. Sie haben keine bequeme mehrdimensionale Numpy-Indizierung in Listenform, aber solange Sie anhängen, ist es schwierig, dies besser zu machen als eine Liste von Zeilenarrays.
quelle
Ich benutze 'np.vstack', was schneller ist, EX:
quelle
Sie können
numpy.append()
eine Zeile an ein leeres Array anhängen und später an eine Matrix umformen.quelle