Gibt es eine Möglichkeit, ein numpy-Array einer Form zu initialisieren und zu ergänzen? 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 weiß über vstack, verketten usw. 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
Die big_array
sollten eine Form haben (10,4)
. Wie macht man das?
BEARBEITEN:
Ich möchte die folgende Klarstellung hinzufügen. Mir ist bewusst, dass ich es definieren big_array = numpy.zeros((10,4))
und dann auffüllen kann. Dies erfordert jedoch die vorherige Angabe der Größe von big_array. Ich kenne die Größe in diesem Fall, aber was ist, wenn ich es nicht tue? Wenn wir die .append
Funktion 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 gibt, um ein größeres Array aus kleineren Arrays zu erstellen, beginnend mit einem leeren Array.
[i for i in range(5)]
. (Entsprechend:list(range(5))
obwohl dies ein erfundenes Beispiel ist.)x = numpy.array()
wir es mit einer Liste wie tun würdeny = []
. aber es hat nicht funktioniertAntworten:
oder
oder
Die Mentalität, in der wir ein Array durch Anhängen von Elementen an eine Liste erstellen, wird in numpy jedoch nicht häufig verwendet, da sie weniger effizient ist (numpy-Datentypen liegen viel näher an den zugrunde liegenden C-Arrays). Stattdessen sollten Sie das Array der Größe zuordnen, die Sie benötigen, und dann die Zeilen ausfüllen. Sie können es jedoch verwenden,
numpy.append
wenn Sie müssen.quelle
append
Anzahl. Es ist nur weniger effizient, keine Vorbelegung vorzunehmen (in diesem Fall viel weniger effizient, daappend
jedes Mal das gesamte Array kopiert wird), daher ist es keine Standardtechnik.np.empty
Arrays mit Werten gefüllt ist? Was ist mit den verbleibenden "leeren" Gegenständen?np.concatenate()
), können Sie initialisieren mit :np.empty((0, some_width))
. 0, also wird Ihr erstes Array kein Müll sein.Normalerweise erstelle ich eine reguläre Liste, füge meine Daten hinzu und wandle die Liste schließlich wie folgt in ein numpy-Array um:
Natürlich nimmt Ihr endgültiges Objekt beim Erstellungsschritt doppelt so viel Speicherplatz ein, aber das Anhängen an die Python-Liste ist sehr schnell und die Erstellung auch mit np.array ().
quelle
Eingeführt in numpy 1.8:
Beispiele:
quelle
Array-Analogon für die Pythons
ist:
quelle
empty((0))
Initialisiert ein Numpy-Array.numpy.fromiter()
ist was Sie suchen:Es funktioniert auch mit Generatorausdrücken, z.
Wenn Sie die Länge des Arrays im Voraus kennen, können Sie es mit einem optionalen Argument 'count' angeben.
quelle
Sie möchten explizite Schleifen beim Array-Computing so weit wie möglich vermeiden, da dies den Geschwindigkeitsgewinn bei dieser Form des Computing verringert. Es gibt mehrere Möglichkeiten, ein Numpy-Array zu initialisieren. Wenn Sie möchten, dass es mit Nullen gefüllt wird, tun Sie, was katrielalex sagte:
big_array = numpy.zeros((10,4))
EDIT: Was für eine Sequenz machst du? Sie sollten sich die verschiedenen Numpy-Funktionen ansehen, mit denen Arrays erstellt werden, z. B.
numpy.linspace(start, stop, size)
(Zahl mit gleichem Abstand) odernumpy.arange(start, stop, inc)
. Wenn möglich, machen diese Funktionen Arrays wesentlich schneller als die gleiche Arbeit in expliziten Schleifenquelle
Verwenden Sie für Ihr erstes Array-Beispiel Folgendes:
Verwenden Sie zum Initialisieren von big_array
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 nicht im Voraus kennen, ist es im Allgemeinen am besten, zuerst eine Python-Liste mit append zu erstellen. Wenn Sie alles in der Liste gesammelt haben, konvertieren Sie diese Liste mit in ein numpy-Array
numpy.array(mylist)
. Der Grund dafür ist, dass Listen sehr effizient und schnell wachsen sollen, während numpy.concatenate sehr ineffizient wäre, da sich die Größe von numpy-Arrays nicht leicht ändern lässt. Sobald jedoch alles in einer Liste zusammengefasst ist und Sie die endgültige Arraygröße kennen, kann ein Numpy-Array effizient erstellt werden.quelle
So initialisieren Sie ein Numpy-Array mit einer bestimmten Matrix:
Ausgabe:
quelle
Wann immer Sie sich in der folgenden Situation befinden:
und Sie möchten etwas Ähnliches in numpy, mehrere frühere Antworten haben Wege aufgezeigt, dies zu tun, aber wie @katrielalex betonte, sind diese Methoden nicht effizient. Der effizienteste Weg, dies zu tun, besteht darin, eine lange Liste zu erstellen und sie dann nach einer langen Liste nach Ihren Wünschen umzugestalten. Nehmen wir zum Beispiel an, ich lese einige Zeilen aus einer Datei und jede Zeile enthält eine Liste von Zahlen. 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:
quelle
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 wird:
Auf diese Weise ordnen Sie das gesamte Ergebnisarray vorab zu
numpy.empty
und füllen die Zeilen aus, während Sie die indizierte Zuweisung verwenden.Es ist absolut sicher, eine Vorbelegung
empty
anstelle des vonzeros
Ihnen angegebenen Beispiels vorzunehmen, da Sie garantieren, dass das gesamte Array mit den von Ihnen generierten Blöcken gefüllt wird.quelle
Ich würde vorschlagen, zuerst die Form zu definieren. Dann iteriere darüber, um Werte einzufügen.
quelle
Vielleicht passt so etwas zu Ihren Bedürfnissen.
Welches erzeugt die folgende Ausgabe
quelle