443 Stimmen

Wie erstelle ich ein leeres Array/Matrix in NumPy?

Ich kann nicht herausfinden, wie ich ein Array oder eine Matrix in der Weise verwenden kann, wie ich normalerweise eine Liste verwenden würde. Ich möchte ein leeres Array (oder eine leere Matrix) erstellen und ihm dann jeweils eine Spalte (oder Zeile) hinzufügen.

Im Moment ist die einzige Möglichkeit, die ich finden kann, dies zu tun, wie:

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

Wäre es hingegen eine Liste, würde ich etwa so vorgehen:

list = []
for item in data:
    list.append(item)

Gibt es eine Möglichkeit, diese Art von Notation zu verwenden für NumPy Arrays oder Matrizen?

593voto

Stephen Simmons Punkte 7205

Sie haben das falsche mentale Modell, um NumPy effizient zu nutzen. NumPy-Arrays werden in zusammenhängenden Speicherblöcken gespeichert. Wenn Sie Zeilen oder Spalten zu einem bestehenden Array hinzufügen möchten, muss das gesamte Array in einen neuen Speicherblock kopiert werden, wodurch Lücken für die neuen Elemente entstehen, die gespeichert werden sollen. Dieser Vorgang ist sehr ineffizient, wenn er wiederholt durchgeführt wird, um ein Array aufzubauen.

Beim Hinzufügen von Zeilen ist es am besten, ein Array zu erstellen, das so groß ist wie Ihr Datensatz letztendlich sein wird, und ihm dann Zeile für Zeile Daten zuzuweisen:

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

143voto

Greg Ball Punkte 3373

Ein NumPy-Array ist eine ganz andere Datenstruktur als eine Liste und ist für unterschiedliche Verwendungszwecke konzipiert. Ihre Verwendung von hstack ist potenziell sehr ineffizient ... jedes Mal, wenn Sie es aufrufen, werden alle Daten im vorhandenen Array in ein neues kopiert. (Die append Funktion wird das gleiche Problem haben). Wenn Sie Ihre Matrix spaltenweise aufbauen wollen, sollten Sie sie am besten in einer Liste aufbewahren, bis sie fertig ist, und sie erst dann in ein Array umwandeln.

z.B..

mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

item kann eine Liste, ein Array oder eine beliebige Iterable sein, solange solange jede item hat die gleiche Anzahl von Elementen.
In diesem besonderen Fall ( data eine Iterable ist, die die Spalten der Matrix enthält), können Sie einfach verwenden

mat = numpy.array(data)

(Beachten Sie auch, dass die Verwendung von list als Variablenname ist wahrscheinlich keine gute Praxis, da es den eingebauten Typ durch diesen Namen maskiert, was zu Fehlern führen kann).

EDIT :

Wenn Sie aus irgendeinem Grund wirklich ein leeres Array erstellen wollen, können Sie einfach numpy.array([]) aber das ist selten nützlich!

88voto

Franck Dernoncourt Punkte 68647

Um ein leeres mehrdimensionales Array in NumPy zu erstellen (z.B. ein 2D-Array m*n um Ihre Matrix zu speichern), falls Sie das nicht wissen m wie viele Zeilen Sie anhängen wollen und sich nicht um die von Stephen Simmons erwähnten Rechenkosten kümmern (nämlich den Neuaufbau des Arrays bei jedem Anhängen), können Sie die Dimension, an die Sie anhängen wollen, auf 0 verkleinern: X = np.empty(shape=[0, n]) .

Auf diese Weise können Sie zum Beispiel (hier m = 5 von dem wir annehmen, dass wir es bei der Erstellung der leeren Matrix nicht wussten, und n = 2 ):

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

die Sie erhalten werden:

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

33voto

Andrei Paga Punkte 281

Ich schaute in diese eine Menge, weil ich brauchte, um eine numpy.array als eine Menge in einem meiner Schulprojekte zu verwenden und ich brauchte, um leer initialisiert werden... Ich habe keine relevante Antwort hier auf Stack Overflow gefunden, also begann ich etwas zu kritzeln.

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

Das Ergebnis wird sein:

In [34]: x
Out[34]: array([], dtype=float64)

Daher können Sie ein np-Array direkt wie folgt initialisieren:

In [36]: x= np.array([], dtype=np.float64)

Ich hoffe, das hilft.

18voto

Pedram Punkte 427

Um ein leeres NumPy-Array zu erstellen, ohne seine Form zu definieren, können Sie wie folgt vorgehen:

arr = np.array([])

Die erste Variante ist vorzuziehen, da Sie wissen, dass Sie diese als NumPy-Array verwenden werden. NumPy konvertiert dies in np.ndarray Typ nachher, ohne extra [] Dimension".

für das Hinzufügen neuer Elemente zum Array können wir tun:

arr = np.append(arr, 'new element')

Beachten Sie, dass es im Hintergrund für Python kein Array ohne seine Form zu definieren. Wie @hpaulj erwähnte, macht dies auch ein einrangiges Array.

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