[英]Convert a dict to numpy multi-dimensional array
我有一個定義如下的python字典,其中最里面的項是兩個元素的數組:
mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
我現在需要將所有第0個元素形成為一個新數組,即使用a [:,:,0]或a [...,0]返回[1,3,5,6]。 但是,a [:,:,0]或a [...,0]在這種情況下將不起作用,如下所示。
import numpy as np
import pandas as pd
a = np.array(pd.DataFrame.from_dict(mydict))
print a
提供以下輸出:
[[[1, 2] [5, 6]]
[[3, 4] [7, 8]]]
看來這是一個2x2x2的陣列。 使用單獨的括號訪問相應的元素沒有問題,例如a [0] [0] [0]返回1。但是,a [0,0,0]會導致錯誤。
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-150-f68aba7de42a> in <module>()
----> 1 a[0,0,0]
IndexError: too many indices for array
似乎兩個元素的數組被視為2x2數組中的元素-但我需要一個2x2x2數組才能實現我的目標。 有什么辦法可以將其轉換為2x2x2數組嗎?
您遇到的問題是熊貓將初始條目(列表)視為對象,因此,當您轉換為numpy數組時,最里面的條目就是列表對象。 例如,
> type(a)
numpy.ndarray
> type(a[0])
numpy.ndarray
> type(a[0,0])
list
如果您知道最終想要的形狀(2x2x2),則可以始終這樣做:
> b = np.array(map(np.array, a.flat)).reshape(2,2,2)
> b.shape
(2, 2, 2)
> b[0,0,0]
1
編輯:或更簡單:
> b = np.array(a.tolist())
array([[[1, 2],
[5, 6]],
[[3, 4],
[7, 8]]])
如果要每個最里面的行的第一項,例如1,3,5,7,則可以根據生成的形狀執行b[...,0]
或b[...,0].flatten()
想。
沒有熊貓,我可以使用以下方法重新創建數組:
In [1723]: mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
In [1724]: mydict
Out[1724]: {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
In [1725]: mydict[1]
Out[1725]: {1: [1, 2], 2: [3, 4]}
In [1726]: mydict[2]
Out[1726]: {1: [5, 6], 2: [7, 8]}
In [1727]: a=np.empty((2,2),dtype=object)
In [1728]: for i in range(2):
...: for j in range(2):
...: a[i,j]=mydict[i+1][j+1]
...:
In [1729]: a
Out[1729]:
array([[[1, 2], [3, 4]],
[[5, 6], [7, 8]]], dtype=object)
In [1730]: print(a)
[[[1, 2] [3, 4]]
[[5, 6] [7, 8]]]
最后的打印與您的相同。
該數組的元素是列表
In [1735]: a[0,1]
Out[1735]: [3, 4]
In [1736]: type(a[0,1])
Out[1736]: list
將其轉換為3d數組的簡便方法是使用tolist
:
In [1737]: a.tolist()
Out[1737]: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
In [1738]: np.array(a.tolist())
Out[1738]:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
In [1739]: _.shape
Out[1739]: (2, 2, 2)
# dtype('int32')
tolist
將數組解壓縮為嵌套列表; 然后, np.array
可以從該列表結構創建最大維數組。
您需要深入研究每個字典元素,然后深入每個子詞典,並拉出每個葉子列表的第一個元素。
a = [mydict[x][y][0] for y in mydict[x] for x in mydict]
結果顯示為Python列表:
[1, 3, 5, 7]
我相信這是您真正想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.