Wenn ich definieren eine einfache Klasse wie:
class MyObj(object):
pass
.
ein Wörterbuch mit mehreren dieser Objekte schaffen könnte:
In [819]: d={1:MyObj(), 2:MyObj()}
und dann Attribute zuweisen, um jedes Objekt
In [820]: d[1].foo=np.arange(3)
In [821]: d[1].bar=np.arange(3)
In [822]: d[2].foo=np.arange(3)
In [823]: d[2].bar=np.arange(3)
In [824]: d
Out[824]: {1: <__main__.MyObj at 0xaf20cfac>, 2: <__main__.MyObj at 0xaf20c4cc>}
Da ich repr
oder str
nicht definiert habe, ist das Druckdisplay nicht sehr interessant;
In [825]: vars(d[2])
Out[825]: {'bar': array([0, 1, 2]), 'foo': array([0, 1, 2])}
konnte ich machte auch eine Liste mit diesen Objekten
In [826]: dl = [None, d[1], d[2]]
In [827]: dl
Out[827]: [None, <__main__.MyObj at 0xaf20cfac>, <__main__.MyObj at 0xaf20c4cc>]
In [828]: vars(dl[1])
Out[828]: {'bar': array([0, 1, 2]), 'foo': array([0, 1, 2])}
beide So eine Liste und Wörterbuch können indiziert werden (so kann ein Array); aber die .foo
Syntax wird verwendet, um auf Objektattribute zuzugreifen.
===============
Eine völlig andere Art und Weise mit einer Struktur mit einem solchen Zugang zu schaffen, ist ein recarray
zu verwenden - das ist ein Array numpy Unterklasse, die ermöglicht, Sie dtype Felder mit Attributnamen für den Zugriff auf
In [829]: R=np.recarray((3,), dtype=[('foo','O'),('bar','O')])
In [830]: R
Out[830]:
rec.array([(None, None), (None, None), (None, None)],
dtype=[('foo', 'O'), ('bar', 'O')])
In [831]: R[1].foo=np.arange(3)
In [832]: R[2].bar=np.arange(4)
In [833]: R
Out[833]:
rec.array([(None, None), (array([0, 1, 2]), None), (None, array([0, 1, 2, 3]))],
dtype=[('foo', 'O'), ('bar', 'O')])
Hier definiert ich die Felder als Objekt dtype nehmen, die mir etwas zuweisen können, einschließlich anderer Arrays jedes Attribut. Aber normalerweise ist der dtyp etwas Spezifischeres wie int, float, string.
kann ich das foo
Attribut/Feld für alle Elemente in dem Array anzeigen R
:
In [834]: R.foo
Out[834]: array([None, array([0, 1, 2]), None], dtype=object)
In [835]: R['bar']
Out[835]: array([None, None, array([0, 1, 2, 3])], dtype=object)
A recarray
hat eine spezielle Methode, den Zugriff auf die Felder über attribute
Syntax ermöglicht.
Eine Liste von Wörterbüchern ist eine gute Idee. – drum
Sicher hängt es von Ihrem tatsächlichen Anwendungsfall ab. Einfaches Erstellen von Arrays ist kein Problem, das Problem ist, wie Sie sie verwenden werden, welche Algorithmen Sie implementieren wollen, usw. –
Da alle Ihre 'numpy.arange' Arrays die gleiche Länge 'x' teilen: Warum nicht Sie? nehmen Sie einfach ein 2D-Array, wobei jede Zeile für einen Bereich steht? – daniel451