2017-02-05 5 views
0

Ich möchte mehrdimensionale Arrays speichern, die etwas wie Python dicts speichern. Im Moment sieht es so etwas wie:Numpy oder Python zum Speichern von Dicts

a = [[{'col':i,'row':j} for i in range(9)] for j in range(9)] 

Ich weiß, dass numpy perfekt, wenn Sie Mathe tun, wie die Arbeit mit Matrizen wollen. Dinge, die ich mag schnell tun:

  • durch mehrdimensionale Indizes zugreifen

  • Ändern der Werte mit mehrdimensionalen Indizes

Und ich weiß nicht, wie das mit dem normalen Python zu tun Listen. Ursache so etwas wie

idx = [2,3] 
print(a[idx]) 

existiert nicht, oder? Es sollte outprint {'row':2,'col':3}

Vielen Dank für Ihre Ideen und wenn numpy ist die bessere Option: Wie erstellt man eine zweidimensionale numpy Array mit Werten von etwas wie eine Liste Typ? Gibt es eine Möglichkeit dtype=dict zu verwenden?

+1

einen Blick auf Pandas nehmen: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html#pandas.DataFrame –

+0

Dank! Ist es möglich, Pandas mehr als 2-dimensional zu haben? Habe gerade xarray gefunden, was ziemlich neu ist. – Wikunia

+0

Sie haben 'Panel', mit dem Sie 3D-Daten haben können: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#panel. AFAIK gibt es keine Unterstützung für mehr als 3 Dimensionen. –

Antwort

2

So Ihre a ist eine Liste von Listen:

In [656]: a = [[{'col':i,'row':j} for i in range(9)] for j in range(9)] 
In [657]: a 
Out[657]: 
[[{'col': 0, 'row': 0}, 
    {'col': 1, 'row': 0}, 
    {'col': 2, 'row': 0}, 
    .... 
In [658]: len(a) 
Out[658]: 9 
In [659]: a[2][3] 
Out[659]: {'col': 3, 'row': 2} 

Erstellen Sie ein Array aus, dass:

In [660]: A=np.array(a, dtype=object) 
In [661]: A.shape 
Out[661]: (9, 9) 
In [662]: A 
Out[662]: 
array([[{'row': 0, 'col': 0}, {'row': 0, 'col': 1}, {'row': 0, 'col': 2}, 
     {'row': 0, 'col': 3}, {'row': 0, 'col': 4}, {'row': 0, 'col': 5}, 

In [663]: A[2,3] 
Out[663]: {'col': 3, 'row': 2} 

nicht viel Unterschied zwischen a[2][3] und A[2,3] mit einem Wörterbuch zuzugreifen. Beide enthalten Zeiger auf die gleichen Wörterbücher

In [664]: A[3,2]['value']=23 # add a key to one; see change in both places 
In [666]: A[3,2] 
Out[666]: {'col': 2, 'row': 3, 'value': 23} 
In [667]: a[3][2] 
Out[667]: {'col': 2, 'row': 3, 'value': 23} 

ich A umformen kann, z. A1=A.reshape(3,27), aber das hat keine Auswirkung auf die Listenverschachtelung von a. Ich konnte ‚flach‘ beide mit:

In [671]: aflat=list(itertools.chain(*a)) # new list, same dict 
In [672]: len(aflat) 
Out[672]: 81 
In [673]: A.ravel().shape  # a view A.flatten() for copy 
Out[673]: (81,) 

ich die dict mit dem zusätzlichen Schlüssel mit einer Liste Verständnis finden konnte, in entweder:

In [674]: [a for a in aflat if len(a)==3] 
Out[674]: [{'col': 2, 'row': 3, 'value': 23}] 
In [675]: [a for a in A.ravel() if len(a)==3] 
Out[675]: [{'col': 2, 'row': 3, 'value': 23}] 

Manchmal mit dem Objekt dtypes es möglich ist, begrenzte Mengen auszuführen Array-Mathe, aber das hängt davon ab, dass sich die Operation auf Objekte ausbreitet. Ich kann mir nichts vorstellen, was das mit Diktaten tun würde.

Für Wörterbuchobjekte gibt es keinen großen Unterschied zwischen der Verwendung von verschachtelten Listen und Objektarrays.


Die üblichen Regeln für die Array-Indizierung gilt:

In [676]: idx=[2,3] 
In [677]: A[idx] # (2,9) array of dict 
Out[677]: 
array([[{'row': 2, 'col': 0}, ...{'row': 3, 'col': 8}]], dtype=object) 
In [678]: A[tuple(idx)]  # 1 dict 
Out[678]: {'col': 3, 'row': 2} 

Structured Array Ansatz, fields mit den gleichen Namen wie Ihre Dictionary-Schlüssel verwenden.

In [681]: dt=np.dtype([('col',int),('row',int)]) 
In [687]: S = np.array([[(i,j) for i in range(3)] for j in range(3)],dtype=dt) 
In [688]: S.shape 
Out[688]: (3, 3) 
In [689]: S 
Out[689]: 
array([[(0, 0), (1, 0), (2, 0)], 
     [(0, 1), (1, 1), (2, 1)], 
     [(0, 2), (1, 2), (2, 2)]], 
     dtype=[('col', '<i4'), ('row', '<i4')]) 
In [691]: S[2,2] 
Out[691]: (2, 2) 
In [692]: S['col'] 
Out[692]: 
array([[0, 1, 2], 
     [0, 1, 2], 
     [0, 1, 2]]) 
In [694]: S[0,2]['row'] 
Out[694]: 0 
Verwandte Themen