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
einen Blick auf Pandas nehmen: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html#pandas.DataFrame –
Dank! Ist es möglich, Pandas mehr als 2-dimensional zu haben? Habe gerade xarray gefunden, was ziemlich neu ist. – Wikunia
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. –