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 hstack
is potentieel zeer inefficiënt… elke keer dat u het aanroept, worden alle gegevens in de bestaande array gekopieerd naar een nieuwe. (De functie append
heeft 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)
item
kan een lijst, een array of een willekeurige iterable zijn, zolang
omdat elk item
hetzelfde aantal elementen heeft.
In dit specifieke geval (data
is een iteratie die de matrixkolommen bevat) die je gewoon kunt gebruiken
mat = numpy.array(data)
(Houd er rekening mee dat het gebruik van list
als 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*n
om je matrix op te slaan), voor het geval je m
niet 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 = 5
waarvan 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:
-
arr = np.array([])
(dit heeft de voorkeur, omdat u weet dat u dit als een NumPy-array gaat gebruiken)
-
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
0
in de eerste regel. numpy.append
is een andere optie. Het roeptnumpy.concatenate
aan.
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.zeros
in plaats van numpy.empty
te 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)