Numpy: Enh: Objekt-Array-Erstellungsfunktion

Erstellt am 2. Juni 2015  ·  4Kommentare  ·  Quelle: numpy/numpy

Wie in Ausgabe #5303 besprochen, ist es derzeit nicht möglich, Arrays des Objekts dtype zu erstellen, die Sequenzen gleicher Länge enthalten, da die Sequenz automatisch als Array-Elemente eingelesen wird. Es gibt einen Vorschlag, dies nur für Listen zu tun, aber dies wäre ein großer Bruch der Abwärtskompatibilität und würde eine lange Verfallszeit erfordern.

Ein anderer Ansatz wäre, eine Funktion explizit zum Erstellen von Arrays mit einem Objekt-dtype zu haben. Vielleicht könnte dies "Objektarray" genannt werden. Die Standardeinstellung für diese Funktion wäre, eine Sequenz aufzunehmen und jedes Element der Sequenz als ein Element in einem 1D-Objektarray zu betrachten.

Die Funktion könnte jedoch ein optionales "ndim"- oder "Tiefe"-Argument haben, das verwendet werden könnte, um anzugeben, wie viele Ebenen der Sequenz als Teil des Arrays betrachtet werden sollen. Dies wäre standardmäßig 0 (nur die äußerste Ebene wird berücksichtigt). Dies würde eine Ausnahme auslösen, wenn die Abmessungen nicht übereinstimmen.

Beachten Sie, dass sich dieser Ansatz nicht gegenseitig mit der Alternative ausschließt, aber den Vorteil hat, dass die Abwärtskompatibilität nicht beeinträchtigt wird.

Also zum Beispiel:

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

Hilfreichster Kommentar

Ich hoffe, ich vermisse nichts, aber es scheint mir, dass ein ndmax -Argument nicht nur das gemeldete Problem lösen würde ("_Arrays von Objekt-Dtypes mit Sequenzen gleicher Länge erstellen_"), sondern auch Leistungssteigerungen bringen würde die Fälle, in denen zB das letzte Objekt in der Eingabe keine Liste (oder eine Liste mit unterschiedlicher Länge) ist. Siehe auch diese Frage .

Alle 4 Kommentare

Ich denke, der einfachste Weg, gleich große Listen in ein Objekt-Array zu bekommen, ist in zwei Schritten:

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

Wahrscheinlich würde eine Implementierung von objectarray so funktionieren.

Ja, das ist derzeit der beste Weg, aber es ist unnötig wortreich. Daher diese Idee.

Ich würde hoffen, dass eine Implementierung dieser Idee einfach in der Lage wäre, die in der array -Funktion verwendete automatische Konvertierung zu umgehen und den ndarray -Konstruktor durch eine eigene zu ersetzen.

Ich hoffe, ich vermisse nichts, aber es scheint mir, dass ein ndmax -Argument nicht nur das gemeldete Problem lösen würde ("_Arrays von Objekt-Dtypes mit Sequenzen gleicher Länge erstellen_"), sondern auch Leistungssteigerungen bringen würde die Fälle, in denen zB das letzte Objekt in der Eingabe keine Liste (oder eine Liste mit unterschiedlicher Länge) ist. Siehe auch diese Frage .

Irgendwelche Fortschritte oder Pläne zur Implementierung ndmax ? Was ich gerade mache:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen