Hoe maak ik een lege array/matrix in NumPy?

Ik kan er niet achter komen hoe ik een array of matrix moet gebruiken op de manier waarop ik normaal een lijst zou gebruiken. Ik wil een lege array (of matrix) maken en er vervolgens één kolom (of rij) tegelijk aan toevoegen.

Op dit moment is de enige manier die ik kan vinden om dit te doen als volgt:

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

Terwijl het een lijst was, zou ik zoiets als dit doen:

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

Is er een manier om dat soort notatie te gebruiken voor NumPy-arrays of -matrices?


Antwoord 1, autoriteit 100%

Je hebt het verkeerde mentale model om NumPy efficiënt te gebruiken. NumPy-arrays worden opgeslagen in aaneengesloten geheugenblokken. Als u rijen of kolommen aan een bestaande array wilt toevoegen, moet de hele array worden gekopieerd naar een nieuw geheugenblok, waardoor er gaten ontstaan voor de nieuwe elementen die moeten worden opgeslagen. Dit is erg inefficiënt als het herhaaldelijk wordt gedaan om een array te bouwen.

In het geval van het toevoegen van rijen, kunt u het beste een array maken die zo groot is als uw dataset uiteindelijk zal zijn, en er vervolgens rij voor rij gegevens aan toewijzen:

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

Antwoord 2, autoriteit 22%

Een NumPy-array is een heel andere gegevensstructuur dan een lijst en is ontworpen om op verschillende manieren te worden gebruikt. Uw gebruik van hstackis potentieel zeer inefficiënt… elke keer dat u het aanroept, worden alle gegevens in de bestaande array gekopieerd naar een nieuwe. (De functie appendheeft hetzelfde probleem.) Als u uw matrix kolom voor kolom wilt opbouwen, kunt u deze het beste in een lijst bewaren totdat deze klaar is, en alleen converteer het dan naar een array.

bijv.


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

itemkan een lijst, een array of een willekeurige iterable zijn, zolang
omdat elk itemhetzelfde aantal elementen heeft.
In dit specifieke geval (datais een iteratie die de matrixkolommen bevat) die je gewoon kunt gebruiken


mat = numpy.array(data)

(Houd er rekening mee dat het gebruik van listals variabelenaam waarschijnlijk geen goede gewoonte is, aangezien het ingebouwde type onder die naam wordt gemaskeerd, wat tot fouten kan leiden.)

BEWERKEN:

Als je om de een of andere reden echt een lege array wilt maken, kun je gewoon numpy.array([])gebruiken, maar dit is zelden nuttig!


Antwoord 3, autoriteit 13%

Om een lege multidimensionale array in NumPy te maken (bijv. een 2D array m*nom je matrix op te slaan), voor het geval je mniet weet hoeveel rijen je voegt toe en geeft niet om de rekenkosten die Stephen Simmons noemde (namelijk het opnieuw opbouwen van de array bij elke toevoeging), je kunt de dimensie waaraan je wilt toevoegen naar 0 drukken: X = np.empty(shape=[0, n]).

Op deze manier kun je bijvoorbeeld (hier m = 5waarvan we aannemen dat we het niet wisten bij het maken van de lege matrix, en 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

wat je zal geven:

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

Antwoord 4, autoriteit 6%

Ik heb hier veel naar gekeken omdat ik een numpy.array moest gebruiken als een set in een van mijn schoolprojecten en ik moest leeg worden geïnitialiseerd… Ik vond geen relevant antwoord hier op Stack Overflow, dus begon ik iets te tekenen.

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

Het resultaat is:

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

Daarom kunt u een np-array als volgt direct initialiseren:

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

Ik hoop dat dit helpt.


Antwoord 5, autoriteit 2%

U kunt de append-functie gebruiken. Voor rijen:

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

Voor kolommen:

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

BEWERKEN
Natuurlijk, zoals vermeld in andere antwoorden, zou ik, tenzij je wat verwerking (bijv. Inversie) op de matrix / array doet ELKE keer dat je er iets aan toevoegt, gewoon een lijst maken, eraan toevoegen en het vervolgens converteren naar een array .


Antwoord 6

Hier is een oplossing om numpys meer op lijsten te laten lijken

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

OUTPUT: array([ 2., 24.])


Antwoord 7

Voor het maken van een lege NumPy-array zonder de vorm te definiëren:

  1. arr = np.array([])
    

    (dit heeft de voorkeur, omdat u weet dat u dit als een NumPy-array gaat gebruiken)

  2. arr = []   # and use it as NumPy array later by converting it
     arr = np.asarray(arr)
    

NumPy converteert dit daarna naar het type np.ndarray, zonder extra []‘dimensie’.


Antwoord 8

Als u de uiteindelijke grootte van de array absoluut niet weet, kunt u de grootte van de array als volgt vergroten:

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.]]
  • Let op de 0in de eerste regel.
  • numpy.appendis een andere optie. Het roept numpy.concatenateaan.

Antwoord 9

Je kunt het toepassen om elk soort array te bouwen, zoals nullen:

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

Antwoord 10

Afhankelijk van waarvoor u dit gebruikt, moet u mogelijk het gegevenstype opgeven (zie ‘dtype’).

Als u bijvoorbeeld een 2D-array van 8-bits waarden wilt maken (geschikt voor gebruik als monochrome afbeelding):

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

Neem voor een RGB-afbeelding het aantal kleurkanalen op in de vorm: shape=(H,W,3)

Misschien kun je ook overwegen om te initialiseren met numpy.zerosin plaats van numpy.emptyte gebruiken. Zie de opmerking hier.


Antwoord 11

Een andere eenvoudige manier om een lege array te maken die array kan bevatten is:

import numpy as np
np.empty((2,3), dtype=object)

Antwoord 12

Ik denk dat je het meeste werk met lijsten wilt doen en het resultaat als matrix wilt gebruiken. Misschien is dit een manier;

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

Antwoord 13

Ik denk dat je een lege numpy-array kunt maken zoals:

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

Deze indeling is handig als u een numpy-array in de lus wilt toevoegen.


Antwoord 14

Misschien is wat u zoekt zoiets als dit:

x=np.array(0)

Op deze manier kun je een array maken zonder enig element. Het lijkt op:

x=[]

Op deze manier kunt u vooraf nieuwe elementen aan uw array toevoegen.


Antwoord 15

De eenvoudigste manier

Invoer:

import numpy as np
data = np.zeros((0, 0), dtype=float)   # (rows,cols)
data.shape

Uitvoer:
(0, 0)

Invoer:

for i in range(n_files):
     data = np.append(data, new_data, axis = 0)

Other episodes