繁体   English   中英

将字典转换为numpy多维数组

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM