wake-up-neo.net

Wie erstelle ich ein leeres Array/eine leere Matrix in NumPy?

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

Im Moment kann ich das nur so finden:

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

Wäre es eine Liste, würde ich so etwas tun:

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

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

235
Ben

Sie haben das falsche mentale Modell für die effiziente Verwendung von NumPy. NumPy-Arrays werden in zusammenhängenden Speicherblöcken gespeichert. Wenn Sie einem vorhandenen Array Zeilen oder Spalten hinzufügen möchten, muss das gesamte Array in einen neuen Speicherblock kopiert werden, sodass Lücken für die neuen Elemente entstehen, die gespeichert werden sollen. Dies ist sehr ineffizient, wenn ein Array wiederholt erstellt wird.

Wenn Sie Zeilen hinzufügen, ist es am besten, ein Array zu erstellen, das so groß ist, wie Ihr Datensatz letztendlich sein wird, und fügen Sie dann Zeile für Zeile Daten hinzu:

>>> 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.]])
336
Stephen Simmons

Ein NumPy-Array ist eine sehr andere Datenstruktur als eine Liste und kann auf verschiedene Arten verwendet werden. Ihre Verwendung von hstack ist möglicherweise sehr ineffizient ... Bei jedem Aufruf werden alle Daten im vorhandenen Array in ein neues kopiert. (Die Funktion append hat das gleiche Problem.) Wenn Sie Ihre Matrix Spalte für Spalte aufbauen möchten, sollten Sie sie am besten in einer Liste lassen, bis sie fertig ist, und 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 ein beliebiges iterierbares Element sein, solange wie jede item die gleiche Anzahl von Elementen hat.
In diesem speziellen Fall (data ist ein Teil der Matrixspalten iterierbar), können Sie einfach verwenden


mat = numpy.array(data)

(Beachten Sie auch, dass die Verwendung von list als Variablenname wahrscheinlich keine gute Praxis ist, da der eingebaute Typ mit diesem Namen maskiert wird, was zu Fehlern führen kann.)

BEARBEITEN:

Wenn Sie aus irgendeinem Grund wirklich ein leeres Array erstellen möchten, können Sie einfach numpy.array([]) verwenden. Dies ist jedoch selten nützlich!

77
Greg Ball

Um ein leeres mehrdimensionales Array in NumPy zu erstellen (z. B. ein 2D-Array m*n zum Speichern Ihrer Matrix), falls Sie m nicht wissen, wie viele Zeilen Sie anfügen, und sich nicht um die rechnerischen Kosten kümmert, die Stephen Simmons beim Erstellen des Arrays an jedem Anhang) können Sie die Dimension auf 0 setzen, an die Sie anhängen möchten: X = np.empty(shape=[0, n]).

Auf diese Weise können Sie beispielsweise verwenden (hier m = 5, von dem wir annehmen, dass wir beim Erstellen 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

was dir geben wird:

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

Ich habe mich viel damit beschäftigt, weil ich in einem meiner Schulprojekte einen numpy.array als Set verwenden musste und ich musste leer initialisiert werden etwas 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 wie folgt direkt initialisieren:

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

Ich hoffe das hilft.

21
Andrei Paga

Sie können die Append-Funktion verwenden. Für Reihen:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

Für Spalten:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

EDIT
Natürlich, wie in anderen Antworten erwähnt, würde ich jedes Mal, wenn Sie etwas an die Matrix anfügen, eine Verarbeitung (zB Inversion) an der Matrix/Array vornehmen zu einem Array.

6
Il-Bhima

Wenn Sie die endgültige Größe des Arrays absolut nicht kennen, können Sie die Größe des Arrays folgendermaßen erhöhen:

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • Beachten Sie den 0 in der ersten Zeile.
  • numpy.append ist eine weitere Option. Es ruft numpy.concatenate auf.
3
cyborg

Sie können es anwenden, um beliebige Arten von Arrays wie Nullen zu erstellen:

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]
2
Ali G

Je nachdem, wofür Sie dies verwenden, müssen Sie möglicherweise den Datentyp angeben (siehe 'dtype' ).

So erstellen Sie beispielsweise ein 2D-Array mit 8-Bit-Werten (geeignet zur Verwendung als Monochrombild):

myarray = numpy.empty(shape=(H,W),dtype='u1')

Fügen Sie für ein RGB-Bild die Anzahl der Farbkanäle in der Form hinzu: shape=(H,W,3)

Möglicherweise möchten Sie auch die Nullinitialisierung mit numpy.zeros in Betracht ziehen, anstatt numpy.empty zu verwenden. Siehe die Anmerkung hier .

1
nobar

Ich denke, Sie möchten die meiste Arbeit mit Listen erledigen und das Ergebnis als Matrix verwenden. Vielleicht ist das ein Weg. 

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)
0
runo

Ich denke, Sie können leere Numpy-Arrays wie folgt erstellen:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

Dieses Format ist nützlich, wenn Sie ein numpy-Array in der Schleife anhängen möchten.

0
veeresh d