webentwicklung-frage-antwort-db.com.de

Initialisieren Sie ein Numpy-Array

Gibt es eine Möglichkeit, ein numpy-Array einer Form zu initialisieren und hinzuzufügen? Ich werde anhand eines Listenbeispiels erklären, was ich brauche. Wenn ich eine Liste von Objekten erstellen möchte, die in einer Schleife generiert wurden, kann ich Folgendes tun:

a = []
for i in range(5):
    a.append(i)

Ich möchte etwas Ähnliches mit einem Numpy-Array machen. Ich kenne mich mit vstack, verketten usw. aus. Es scheint jedoch, dass diese zwei numpy Arrays als Eingaben erfordern. Was ich brauche ist:

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
    array i of shape = (2,4) created.
    add to big_array

Das big_array Sollte eine Form (10,4) Haben. Wie macht man das?


EDIT:

Ich möchte die folgende Klarstellung hinzufügen. Mir ist bewusst, dass ich big_array = numpy.zeros((10,4)) definieren und dann auffüllen kann. Hierzu muss jedoch die Größe von big_array im Voraus angegeben werden. Ich kenne die Größe in diesem Fall, aber was ist, wenn ich es nicht tue? Wenn wir die Funktion .append Zum Erweitern der Liste in Python verwenden, müssen wir die endgültige Größe nicht im Voraus kennen. Ich frage mich, ob es etwas Ähnliches für die Erstellung eines größeren Arrays aus kleineren Arrays gibt, beginnend mit einem leeren Array.

107
Curious2learn

numpy.zeros

Gibt ein neues Array mit der angegebenen Form und dem angegebenen Typ zurück, das mit Nullen gefüllt ist.

oder

numpy.ones

Gibt ein neues Array mit einer bestimmten Form und einem Typ zurück, das mit Einsen gefüllt ist.

oder

numpy.empty

Gibt ein neues Array mit der angegebenen Form und dem angegebenen Typ zurück, ohne die Einträge zu initialisieren.


Die Mentalität, mit der wir ein Array erstellen, indem wir Elemente an eine Liste anhängen, wird in numpy jedoch nicht häufig verwendet, da sie weniger effizient ist (numpy-Datentypen sind den zugrunde liegenden C-Arrays viel näher). Stattdessen sollten Sie das Array der Größe zuweisen, die Sie benötigen, und dann die Zeilen ausfüllen. Sie können numpy.append wenn Sie müssen, aber.

135
Katriel

Normalerweise erstelle ich dazu eine reguläre Liste, hänge meine Daten an die Liste an und wandle sie schließlich wie folgt in ein numpy-Array um:

import numpy as np
big_array = [] #  empty regular list
for i in range(5):
    arr = i*np.ones((2,4)) # for instance
    big_array.append(arr)
big_np_array = np.array(big_array)  # transformed to a numpy array

natürlich nimmt Ihr endgültiges Objekt beim Erstellungsschritt das Doppelte des Speicherplatzes in Anspruch, aber das Anhängen an python list ist sehr schnell und die Erstellung mit np.array () ebenfalls.

37
mad7777

Eingeführt in numpy 1.8:

numpy.full

Gibt ein neues Array mit der angegebenen Form und dem angegebenen Typ zurück, das mit fill_value gefüllt ist.

Beispiele:

>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf,  inf],
       [ inf,  inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
       [10, 10]])
13

Array-Analog für den Python

a = []
for i in range(5):
    a.append(i)

ist:

import numpy as np

a = np.empty((0))
for i in range(5):
    a = np.append(a, i)
11
Adobe

numpy.fromiter() ist das, wonach Sie suchen:

big_array = numpy.fromiter(xrange(5), dtype="int")

Es funktioniert auch mit Generatorausdrücken, z.

big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )

Wenn Sie die Länge des Arrays im Voraus kennen, können Sie sie mit einem optionalen Argument 'count' angeben.

7

Sie möchten explizite Schleifen beim Array-Computing so weit wie möglich vermeiden, da dies den Geschwindigkeitsgewinn dieser Art von Computing verringert. Es gibt mehrere Möglichkeiten, ein Numpy-Array zu initialisieren. Wenn Sie wollen, dass es mit Nullen gefüllt wird, tun Sie wie katrielalex sagte:

big_array = numpy.zeros((10,4))

EDIT: Was für eine Sequenz machst du? Sie sollten die verschiedenen numpy-Funktionen prüfen, mit denen Arrays erstellt werden, z. B. numpy.linspace(start, stop, size) (Zahl mit gleichem Abstand) oder numpy.arange(start, stop, inc). Wenn möglich, werden Arrays mit diesen Funktionen wesentlich schneller als bei der Ausführung derselben Arbeit in expliziten Schleifen

Verwenden Sie für Ihr erstes Array-Beispiel:

a = numpy.arange(5)

Verwenden Sie zum Initialisieren von big_array

big_array = numpy.zeros((10,4))

Dies setzt voraus, dass Sie mit Nullen initialisieren möchten, was ziemlich typisch ist, aber es gibt viele andere Möglichkeiten, ein Array in numpy zu initialisieren .

Bearbeiten: Wenn Sie die Größe von big_array im Voraus nicht kennen, ist es im Allgemeinen am besten, zuerst ein Python) zu erstellen list using append, und wenn Sie alles in der Liste gesammelt haben, konvertieren Sie diese Liste mit numpy.array(mylist) in ein numpy-Array. Der Grund dafür ist, dass Listen sehr effizient und schnell wachsen sollen, während numpy.concatenate Dies wäre sehr ineffizient, da sich die Größe von numpy-Arrays nicht leicht ändern lässt. Wenn jedoch alle Elemente in einer Liste zusammengefasst sind und Sie die endgültige Array-Größe kennen, kann ein numpy-Array effizient erstellt werden.

5
tom10

Wann immer Sie in der folgenden Situation sind:

a = []
for i in range(5):
    a.append(i)

und Sie möchten etwas Ähnliches in der Anzahl, haben mehrere frühere Antworten Möglichkeiten aufgezeigt, um es zu tun, aber wie @ katrielalex wies darauf hin, sind diese Methoden nicht effizient. Der effiziente Weg, dies zu tun, besteht darin, eine lange Liste zu erstellen und sie dann nach einer langen Liste in die gewünschte Form zu bringen. Nehmen wir zum Beispiel an, ich lese einige Zeilen aus einer Datei und jede Zeile enthält eine Liste von Zahlen und ich möchte ein numpy-Array von Formen erstellen (Anzahl der gelesenen Zeilen, Länge des Vektors in jeder Zeile). So würde ich es effizienter machen:

long_list = []
counter = 0
with open('filename', 'r') as f:
    for row in f:
        row_list = row.split()
        long_list.extend(row_list)
        counter++
#  now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array
3
Heapify
import numpy as np

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])

print mat.shape
print mat

ausgabe:

(5, 5)
[[1 1 0 0 0]
 [0 1 0 0 1]
 [1 0 0 1 1]
 [0 0 0 0 0]
 [1 0 1 0 1]]
3
edW

Ich würde vorschlagen, zuerst die Form zu definieren. Dann iterieren Sie darüber, um Werte einzufügen.

big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
    big_array[it] = (it,it) # For example

>>>big_array

array([[ 0.,  0.],
       [ 1.,  1.],
       [ 2.,  2.],
       [ 3.,  3.],
       [ 4.,  4.],
       [ 5.,  5.]])
2
GT GT

Mir ist klar, dass dies etwas spät ist, aber ich habe keine der anderen Antworten bemerkt, in denen die Indizierung in das leere Array erwähnt wurde:

big_array = numpy.empty(10, 4)
for i in range(5):
    array_i = numpy.random.random(2, 4)
    big_array[2 * i:2 * (i + 1), :] = array_i

Auf diese Weise weisen Sie das gesamte Ergebnis-Array mit numpy.empty Vorab zu und füllen die Zeilen mit der indizierten Zuweisung aus.

Es ist absolut sicher, empty anstelle von zeros in dem von Ihnen angegebenen Beispiel vorab zuzuweisen, da Sie garantieren, dass das gesamte Array mit den von Ihnen generierten Blöcken gefüllt wird.

2
Mad Physicist

Vielleicht passt so etwas zu Ihren Bedürfnissen.

import numpy as np

N = 5
res = []

for i in range(N):
    res.append(np.cumsum(np.ones(shape=(2,4))))

res = np.array(res).reshape((10, 4))
print(res)

Welches erzeugt die folgende Ausgabe

[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]]
1
MPath