248 Stimmen

Numpy - Zeile zu Array hinzufügen

Wie kann man Zeilen zu einem Numpy-Array hinzufügen?

Ich habe ein Array A:

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

Ich möchte Zeilen aus einem anderen Array X zu diesem Array hinzufügen, wenn das erste Element jeder Zeile in X eine bestimmte Bedingung erfüllt.

Numpy-Arrays haben keine Methode "append" wie die von Listen, zumindest scheint es so.

Wenn A und X Listen wären, würde ich einfach tun:

for i in X:
    if i[0] < 3:
        A.append(i)

Gibt es eine numpythonisch Wie kann man das Gleiche tun?

Danke, S ;-)

256voto

jknair Punkte 4331

Sie können dies tun:

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

154voto

eumiro Punkte 193562

Was ist X ? Wenn es sich um ein 2D-Array handelt, wie kann man dann seine Zeile mit einer Zahl vergleichen? i < 3 ?

EDIT 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]])

hinzufügen A alle Zeilen aus X wobei das erste Element < 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]])

59voto

Flora PJ Li Punkte 711

Da diese Frage wurde 7 Jahre vor, in der neuesten Version, die ich benutze, ist numpy Version 1.13, und Python3, ich tue die gleiche Sache mit dem Hinzufügen einer Zeile zu einer Matrix, denken Sie daran, eine Doppelbügel auf das zweite Argument, andernfalls kommt es zu einem Dimensionsfehler.

Hier füge ich die 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 um jemanden zu interessieren, wenn Sie eine Spalte hinzufügen möchten,

array = np.c_[A,np.zeros(#A's row size)]

wie zuvor bei der Matrix A, indem eine Spalte hinzugefügt wird

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

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

Wenn Sie etwas voranstellen wollen, können Sie einfach die Reihenfolge der Argumente umkehren, d.h.:

np.r_([[7, 8, 9]], A)

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

23voto

rbasham Punkte 181

Wenn keine Berechnungen nach jeder Zeile erforderlich sind, ist es viel schneller, Zeilen in Python hinzuzufügen und dann in Numpy zu konvertieren. Hier sind Zeittests mit Python 3.6 im Vergleich zu Numpy 1.14, bei denen 100 Zeilen nacheinander 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 also darin, vstack() zu verwenden, um 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 jeder Hinzufügung eine Datenanalyse auf dem Array durchfü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 mit vstack() zum Numpy-Array hinzuzufügen, bevor Sie eine Datenanalyse durchführen.

11voto

cam Punkte 135

Sie können auch dies tun:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X