Gedächtnisfreundliche Möglichkeit, ein Feld zu einem strukturierten ndarray hinzuzufügen – ohne Daten zu duplizieren?

Um ein Feld zu einem strukturierten numpy Array hinzuzufügen, ist es ganz einfach, ein neues Array mit einem neuen dtype zu erstellen, über die alten Felder zu kopieren und das neue Feld hinzuzufügen. Allerdings muss ich das für ein Array machen, das viel Gedächtnis braucht, und ich würde lieber nicht alles duplizieren. Sowohl meine eigene Implementierung als auch die (langsame) Implementierung in numpy.lib.recfunctions.append_fields duplicate memory.

Gibt es eine Möglichkeit, ein Feld zu einem strukturierten ndarray , ohne das Gedächtnis zu duplizieren? Das heißt, entweder ein Weg, der die Schaffung eines neuen ndarray vermeidet, oder eine Möglichkeit, ein neues ndarray zu erstellen, das auf die gleichen Daten wie die alten zeigt?

Lösungen, die RAM vervielfachen:

  • Hinzufügen eines Feldes zu einem strukturierten numpy Array

  • Hinzufügen eines Feldes zu einem strukturierten numpy Array (2)

  • Hinzufügen eines Feldes zu einem strukturierten numpy Array (3)

Es gibt eine ähnliche Frage, wo die Herausforderung zu entfernen , nicht hinzufügen, Felder. Die Lösung verwendet eine Ansicht, die für eine Teilmenge der ursprünglichen Daten arbeiten sollte, aber ich bin mir nicht sicher, ob sie geändert werden kann, wenn ich lieber Felder hinzufügen möchte.

One Solution collect form web for “Gedächtnisfreundliche Möglichkeit, ein Feld zu einem strukturierten ndarray hinzuzufügen – ohne Daten zu duplizieren?”

Ein strukturiertes Array wird wie ein normales, als zusammenhängendes Puffer von Bytes gespeichert, ein Datensatz nach dem vorherigen. Die Aufzeichnungen sind also ein bisschen wie die letzte Dimension eines mehrdimensionalen Arrays. Sie können keine Spalte zu einem 2d-Array hinzufügen, ohne ein neues Array über eine Verkettung zu erstellen.

Hinzufügen eines Feldes, sagen I4 dtype zu dtype das ist, sagen wir, 20 Bytes lang, bedeutet das Ändern der Aufzeichnung (Element) Länge zu 24, dh Hinzufügen von 4 Bytes zum Puffer jedes 20. Byte. numpy kann das nicht machen, ohne einen neuen Datenpuffer zu machen und Werte aus dem alten (und dem neuen) zu kopieren.

Tatsächlich, wenn wir auch über das Hinzufügen eines neuen Datensatzes zum Array sprechen würden, dh die Verknüpfung eines neuen Arrays, würde es dennoch erforderlich sein, einen neuen Datenpuffer zu erstellen. Arrays sind fixiert.

Felder in einem strukturierten Array sind nicht wie Objekte in einer Liste oder einem Wörterbuch. Sie können kein Feld hinzufügen, indem Sie einfach einen Zeiger auf ein Objekt an anderer Stelle im Speicher hinzufügen.

Vielleicht solltest du ein Wörterbuch benutzen, wobei das item ein Array ist. Dann können Sie frei ein Key / Item hinzufügen, ohne die vorhandenen zu kopieren. Aber dann wird der Zugriff durch 'Zeilen' langsam.

Python ist die beste Programmiersprache der Welt.