将dict转换为numpy多维数组

use*_*012 1 python arrays dictionary numpy

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

    mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}}
Run Code Online (Sandbox Code Playgroud)

我现在需要的是将所有第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
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

    [[[1, 2] [5, 6]]
     [[3, 4] [7, 8]]]
Run Code Online (Sandbox Code Playgroud)

看来这是一个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
Run Code Online (Sandbox Code Playgroud)

似乎两元素数组被认为是2x2数组中的元素 - 但我需要的是一个2x2x2数组才能实现我的目标.有没有办法将其转换为2x2x2阵列?

wfl*_*nny 5

您的问题来自于pandas将您的初始条目(列表)视为对象这一事实,因此当您转换为numpy数组时,您最内部的条目是列表对象.例如,

> type(a)
numpy.ndarray
> type(a[0])
numpy.ndarray
> type(a[0,0])
list
Run Code Online (Sandbox Code Playgroud)

如果您知道最终想要的形状(2x2x2),您可以随时执行:

> b = np.array(map(np.array, a.flat)).reshape(2,2,2)
> b.shape
(2, 2, 2)
> b[0,0,0]
1
Run Code Online (Sandbox Code Playgroud)

编辑:甚至更简单:

> b = np.array(a.tolist())
array([[[1, 2],
        [5, 6]],

       [[3, 4],
        [7, 8]]])
Run Code Online (Sandbox Code Playgroud)

如果你想要每个最里面的行的第一项,例如1,3,5,7,你可以做b[...,0]或者b[...,0].flatten()根据你想要的结果形状.