如何将嵌套字典转换为 3D 数组

Posted

技术标签:

【中文标题】如何将嵌套字典转换为 3D 数组【英文标题】:How to Convert a Nested Dictionary to a 3D array 【发布时间】:2018-04-19 13:39:04 【问题描述】:

我正在尝试将嵌套字典转换为 Python3 中的 3D 数组。我有一个来自另一篇文章的函数,它完成了将 Nest Dict 转换为列表,如下所示

def Convert_Nest_Dictionary_2_List(Dictionary):
    local_list = []
    for key, value in Dictionary.items():
        local_list.append(key)
        local_list.extend(Convert_Nest_Dictionary_2_List(value))
    return local_list

当我使用这个功能时,我得到了错误:

`'numpy.ndarray' object has no attribute 'items'`

我假设这是因为我的嵌套字典中的对应值是具有形状 (96,144) 的多维数组,而不是单个值。

我的嵌套字典很大,所以我只在下面显示它的一部分。输入 dict RCP45 返回:

'Sim1': '01': '2005': array([[ 244.94081116, 244.95672607,...

有 3 个 Sims,每个 sim 中有 12 个键(用于月份),每个月有 61 个键(2005-2065 表示年份),每个对应的值将全球空间温度数据表示为 (96,144) 数组(纬度和经度)。

我希望得到的数组是 (2196,94,144) 的形状,其中 2196 代表 3*12*61 (sims* Months *years)

我将如何修改函数来实现这一点?或者也许一起使用不同的方法来实现这一点?

非常感谢!

【问题讨论】:

【参考方案1】:

您需要进行基本情况检查(当递归到达您的 numpy 数组时)。大致如下:

def Convert_Nest_Dictionary_2_List(Dictionary):
    local_list = []
    if isinstance(Dictionary, numpy.ndarray):
        return np_array_to_whatever_youre_trying_to_get(Dictionary)
    for key, value in Dictionary.items():
        local_list.append(key)
        local_list.extend(Convert_Nest_Dictionary_2_List(value))
    return local_list

虽然更改变量名可能是合适的。

【讨论】:

抱歉,当我复制该位时,我使用了.items() 函数,只需输入字典名称RCP45 即可返回'Sim1': '01': '2005': array([[ 244.94081116, 244.95672607,...。我是使用嵌套字典的新手,但如果我没记错的话,这是一个嵌套字典? 是的,就是这样。尽管我仍然对您如何在数据结构的叶子(形状为 (96, 144) 的 numpy.ndarray)处获得二维数组感到困惑。我原以为这会使您的数据成为 4D 而非 3D。

以上是关于如何将嵌套字典转换为 3D 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套字典转换为 pandas DataFrame?

如何将嵌套字典转换为数据框

如何将嵌套字典转换为熊猫数据框?

如何将不带引号的嵌套字符串字典转换为Python中的字典

如何将包含嵌套列表的字典列表转换为 pandas df

将嵌套字典键值转换为 pyspark 数据框