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 ;-)
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]])
gut kannst du das:
newrow = [1,2,3]
A = numpy.vstack([A, newrow])
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]])
Sie können dies auch tun:
newrow = [1,2,3]
A = numpy.concatenate((A,newrow))
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.
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.
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)
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])
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])
array_ = np.concatenate((array_, add_row), axis=0)