2016-10-09 3 views
0

ich eine Datenstruktur von leeren numpy Array etwas dieser Art erstellen möchten:Dictionary of numpy Array in Python

d[1].foo = numpy.arange(x) 
d[1].bar = numpy.arange(x) 
d[2].foo = numpy.arange(x) 
d[2].bar = numpy.arange(x) 

Was wäre die beste Option ... eine Liste der Wörterbücher enthält numpy Arrays?

+0

Eine Liste von Wörterbüchern ist eine gute Idee. – drum

+0

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. –

+0

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

Antwort

1

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.