将dict转换为numpy多维数组

时间:2016-10-26 19:20:17

标签: python arrays numpy dictionary

我有一个python字典定义如下,其中最里面的项是双元素数组:

    mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}

我现在需要的是将所有第0个元素组成一个新数组,即使用[:,:0]或[...,0]返回[1,3,5,6] 。但是,[:,:0]或[...,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阵列。使用单独的括号访问相应的元素没有问题,例如,[0] [0] [0]返回1.但是,[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阵列?

3 个答案:

答案 0 :(得分:5)

您的问题来自于pandas将您的初始条目(列表)视为对象这一事实,因此当您转换为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(),具体取决于您想要的结果。

答案 1 :(得分:2)

没有Pandas我可以用:

重新创建你的数组
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从列表结构中创建最高维数组。

答案 2 :(得分:1)

你需要挖掘每个字典元素,然后进入每个子字典,并拉出每个叶子列表的第一个元素。

a = [mydict[x][y][0] for y in mydict[x] for x in mydict]

作为Python列表的结果:

[1, 3, 5, 7]

我相信这就是你真正想要的。