it-swarm.com.de

Numpy - Zeile zum Array hinzufügen

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.

Für unpuffige Arrays gibt es keine Methode, wie Listen, wie es scheint.

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 einen numpythonic - Weg, um das Äquivalent zu tun?

Danke, S ;-)

119

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

BEARBEITEN nach OPs Kommentar:

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

füge A alle Zeilen aus X hinzu, wobei das erste Element < 3:

A = vstack((A, X[X[:,0] < 3]))

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

gut kannst du das:

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

Da diese Frage vor sieben Jahren gestellt wurde und ich in der neuesten Version, die ich verwende, Numpy-Version 1.13 und Python3 verwende, füge ich einer Matrix eine Zeile hinzu. Denken Sie daran, eine doppelte Klammer zu setzen zum zweiten Argument, andernfalls wird der 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 zu jemandes Interesse, wenn Sie eine Spalte hinzufügen möchten,

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

folgen Sie dem, was wir zuvor in Matrix A getan haben, und fügen Sie eine Spalte hinzu

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

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])
20
Flora PJ Li

Sie können dies auch tun:

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

Wenn nach jeder Zeile keine Berechnungen erforderlich sind, ist es viel schneller, Zeilen in Python hinzuzufügen und dann in numpy umzuwandeln. Hier sind Timing-Tests mit Python 3.6 vs. Numpy 1.14, wobei jeweils 100 Zeilen hinzugefügt werden:

import numpy as py
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

Daher besteht die einfache Lösung für die ursprüngliche Frage vor sieben Jahren 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 nach jeder Addition keine Datenanalyse für das Array durchführen müssen, sollten Sie die neuen Zeilen besser in einer Python-Zeilenliste (wirklich einer Liste von Listen) puffern und sie als Gruppe zum Array numpy hinzufügen Verwenden Sie vstack (), bevor Sie eine Datenanalyse durchführen.

3
rbasham

Wenn Sie die Konstruktion in einem einzigen Vorgang durchführen können, ist die Antwort auf die Vstack-with-Fancy-Indizierung ein guter Ansatz. Wenn Ihr Zustand jedoch komplizierter ist oder Ihre Reihen spontan eintreten, möchten Sie möglicherweise das Array vergrößern. Tatsächlich besteht der numpythonic-Weg, um so etwas - dynamisch ein Array wachsen zu lassen - 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 für diese Art von Zugriffsmustern stark optimiert. Sie haben zwar keine praktische mehrdimensionale mehrdimensionale Indizierung in Listenform, aber solange Sie anhängen, ist es schwierig, eine Liste mit Zeilenarrays zu erstellen.

2
user2475529

Sie können numpy.append() verwenden, um eine Zeile an ein Array anzuhängen und später an eine Matrix zu formen.

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)
2
Charles Chow

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])
1
Rona
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

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