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


311

Ich kann nicht herausfinden, wie ein Array oder eine Matrix so verwendet wird, 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 nur so Folgendes finden:

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

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

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

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

Antworten:


441

Sie haben das falsche mentale Modell, um NumPy effizient zu nutzen. 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, wodurch Lücken für die neuen zu speichernden Elemente entstehen. Dies ist sehr ineffizient, wenn wiederholt ein Array erstellt wird.

Wenn Sie Zeilen hinzufügen, erstellen Sie am besten ein Array, das so groß ist, wie Ihr Datensatz möglicherweise sein wird, und fügen Sie dann zeilenweise 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.]])

123
Es gibt auch numpy.empty (), wenn Sie das Array nicht auf Null setzen müssen.
Janneb

21
Was ist der Vorteil der Verwendung von empty () gegenüber Nullen ()?
Zach

45
Wenn Sie es sofort mit Ihren Daten initialisieren, sparen Sie die Kosten für das Nullsetzen.
Marcorossi

16
@maracorossi .empty()bedeutet also, dass man zufällige Werte in den Zellen finden kann, aber das Array wird schneller erstellt als zB mit .zeros()?
user3085931

6
@ user3085931 yep!
Nathan

98

Ein NumPy-Array ist eine ganz andere Datenstruktur als eine Liste und kann auf unterschiedliche Weise verwendet werden. Ihre Verwendung von hstackist möglicherweise sehr ineffizient. Jedes Mal, wenn Sie es aufrufen, werden alle Daten im vorhandenen Array in ein neues kopiert. (Die appendFunktion hat das gleiche Problem.) Wenn Sie Ihre Matrix spaltenweise aufbauen möchten, sollten Sie sie am besten in einer Liste belassen, bis sie fertig ist, und sie erst dann in ein Array konvertieren.

z.B


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

itemkann eine Liste, ein Array oder ein beliebiges iterierbares itemElement sein , sofern jedes die gleiche Anzahl von Elementen aufweist.
In diesem speziellen Fall ( dataist einige iterierbar, die die Matrixspalten enthält) können Sie einfach verwenden


mat = numpy.array(data)

(Beachten Sie auch, dass die Verwendung listals Variablenname wahrscheinlich keine gute Vorgehensweise ist, da der integrierte 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 es einfach verwenden numpy.array([]), aber dies ist selten nützlich!


1
Unterscheiden sich numpy Arrays / Matrizen grundlegend von Matlab?
Levesque

1
Wenn Sie aus irgendeinem Grund ein leeres Array definieren müssen, jedoch mit fester Breite (z. B. np.concatenate()), können Sie Folgendes verwenden : np.empty((0, some_width)). 0, also wird Ihr erstes Array kein Müll sein.
NumesSanguis

56

Um ein leeres mehrdimensionales Array in NumPy zu erstellen (z. B. ein 2D-Array m*nzum Speichern Ihrer Matrix), falls Sie nicht wissen, mwie viele Zeilen Sie anhängen werden, und sich nicht um die von Stephen Simmons erwähnten Rechenkosten kümmern (nämlich das Neuerstellen des Arrays ) Array an jedem Anhang) können Sie die Dimension, an die Sie anhängen möchten, auf 0 drücken : X = np.empty(shape=[0, n]).

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

1
Dies sollte die Antwort auf die Frage sein, die OP für den Anwendungsfall gestellt hat, bei dem Sie #rows nicht im Voraus kennen oder den Fall behandeln möchten, dass 0 Zeilen vorhanden sind
Spcogg am zweiten

26

Ich habe mir das sehr genau angesehen, weil ich in einem meiner Schulprojekte ein numpy.array als Set verwenden musste und leer initialisiert werden musste ... Ich habe hier auf Stack Overflow keine relevante Antwort gefunden, also habe ich angefangen 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.


Dies funktioniert nicht wie in der Frage für Arrays, kann jedoch für Vektoren nützlich sein.
Divenex

a=np.array([])scheint standardmäßigfloat64
P i

7

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

>>> 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]])

BEARBEITEN
Natürlich würde ich, wie in anderen Antworten erwähnt, nur eine Liste erstellen, sie anhängen und dann in eine konvertieren, es sei denn, Sie bearbeiten die Matrix / das Array jedes Mal, wenn Sie etwas daran anhängen, (z. B. Inversion) Array.


3

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 das 0in der ersten Zeile.
  • numpy.appendist eine andere Option. Es ruft numpy.concatenate.

3

Sie können es anwenden, um jede Art von Array zu erstellen, z. B. Nullen:

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

4
Wenn Sie das in reinem Python tun möchten, a= [0] * 5ist die einfache Lösung
Makers_F

3

Hier ist eine Problemumgehung, damit Numpys eher wie Listen aussehen

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

AUSGABE: Array ([2., 24.])


2

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 (zur Verwendung als Schwarzweißbild geeignet):

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

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

Möglicherweise möchten Sie auch eine Nullinitialisierung mit numpy.zerosanstelle einer Verwendung in Betracht ziehen numpy.empty. Siehe den Hinweis hier .


1

Ich denke, Sie möchten den größten Teil der Arbeit mit Listen erledigen und dann 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)

1

Ich denke, Sie können ein leeres numpy-Array erstellen wie:

>>> 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 an die Schleife anhängen möchten.


0

Um ein leeres NumPy-Array zu erstellen, ohne seine Form zu definieren, gibt es folgende Möglichkeiten:

1.

arr = np.array([]) 

bevorzugt. weil Sie wissen, dass Sie dies als numpy verwenden werden.

2.

arr = []
# and use it as numpy. append to it or etc..

NumPy konvertiert dies anschließend ohne Extra in den Typ np.ndarray [] dimionsion.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.