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?
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.]])
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!
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.]]
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.
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.
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.]]
0
in der ersten Zeile.numpy.append
ist eine weitere Option. Es ruft numpy.concatenate
auf.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]
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 .
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)
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.