Numpy - Zeile zum Array hinzufügen


161

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:


120

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:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])

Fügen Sie Aallen Zeilen hinzu, von Xdenen aus das erste Element stammt < 3:

import numpy as np
A = np.vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])

1
Entschuldigung, guter Punkt! Angenommen, ein 2D-Array, dessen erstes Element jeder Zeile eine Bedingung erfüllen muss. Ich werde das bearbeiten. Danke, S ;-)
Darren J. Fitzpatrick

2
@ DarrenJ.Fitzpatrick Denken Sie daran, dass Sie mit dieser Art der Manipulation gegen die gute Arbeit arbeiten, die Numpy bei der Vorbelegung des Speichers für Ihr vorhandenes Array leistet 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.
dtlussier

166

Nun, du kannst das tun:

  newrow = [1,2,3]
  A = numpy.vstack([A, newrow])

2
@Kris Warum ist es veraltet? Ich sehe nichts in Dokumenten
Georgy

1
@ George Um ehrlich zu sein, ich weiß es nicht. Ich war hier auf der Suche nach Antworten wie Sie :-). Ich kann mich jetzt nicht erinnern, warum ich den obigen Kommentar geschrieben habe. Ich muss in den Dokumenten gesehen haben, dass es veraltet ist. Aber jetzt schauen Sie sich die Dokumente an ... das sagt es nicht. Ist es möglich, dass sie es abgelehnt haben, dann ihre Meinung erneut geändert haben und entschieden haben, dass es für zu viele Leute zu ärgerlich wäre, es zu verwerfen und zu entfernen?
Kris

32

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

1 2 3
4 5 6

mit einer Reihe

7 8 9

gleiche Verwendung in np.r_

A= [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)

    >> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
#or 
np.r_[A,[[7,8,9]]]

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

np.c_[A, [2,8]]

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])

10

Sie können dies auch tun:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))

2
Hmmm. Als ich dies versuchte, wurde es nur am Ende von A hinzugefügt, anstatt wie gewünscht eine neue Zeile hinzuzufügen.
Todd Curry

13
wahrscheinlichnp.concatenate((A,newrow), axis=0)
Konstantinos Roditakis

3
Ab der Numpy-Version 1.12.1(und in Python 3) scheint es, als würde versucht, einen Vektor mit einer Matrix zu verketten ValueError: 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.
MRule

3
@MRule Sie können dies beheben, indem Sie doppelte eckige Klammern gemäß der Antwort von @Flora PJ Li stackoverflow.com/a/47845065/1410035 verwenden . newrow = [[1,2,3]]
Tom Saleeba

10

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:

import numpy as np 
from time import perf_counter, sleep

def time_it():
    # Compare performance of two methods for adding rows to numpy array
    py_array = [[0, 1, 2], [0, 2, 0]]
    py_row = [4, 5, 6]
    numpy_array = np.array(py_array)
    numpy_row = np.array([4,5,6])
    n_loops = 100

    start_clock = perf_counter()
    for count in range(0, n_loops):
       numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
    duration = perf_counter() - start_clock
    print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))

    start_clock = perf_counter()
    for count in range(0, n_loops):
        py_array.append(py_row) # .15 micros
    numpy_array = np.array(py_array) # 43.9 micros       
    duration = perf_counter() - start_clock
    print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
    sleep(15)

#time_it() prints:

numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row

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.


5
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

array_ = np.concatenate((array_, add_row), axis=0)

3

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:

A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
    newrow = np.arange(3)+i
    if i%5:
        Alist.append(newrow)
A = np.array(Alist)
del Alist

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.


3

Ich benutze 'np.vstack', was schneller ist, EX:

import numpy as np

input_array=np.array([1,2,3])
new_row= np.array([4,5,6])

new_array=np.vstack([input_array, new_row])

2

Sie können numpy.append()eine Zeile an ein leeres Array anhängen und später an eine Matrix umformen.

import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
    A = np.append(A, row)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.