[英]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.