将Python嵌套字典转换为Numpy数组

3

I have a dictionary in the format of:

{"k": {"k1": [[v1]],"k2": [[v2]],"k3": [[v3]]}

如何将它转换成以下格式的两个数组:
[kk1,kk2,kk3]
[v1,v2,v3]

我在Python中有一个函数,但是我无法按照要求的格式得到结果。

def dict_to_list_of_keys(d, l, loc):
    for k in iter(d):
        loc.append(k)
        l.append(loc * 1)
        if isinstance(d[k], dict):
            dict_2_list_of_keys(d[k], l, loc)
        loc.pop()
    return l
3个回答

2

我会使用pandas来完成这个任务。首先从字典中创建一个数据框。

import pandas as pd
import numpy as np

dict_test = {"k": {"k1": [['v1']],"k2": [['v2']],"k3": [['v3']]}}

df = pd.DataFrame.from_dict(dict_test)

Pandas聪明地将关键值转换为索引,将实际列表值作为数据。现在,您可以对数据框进行子集操作,以任何您喜欢的方式提取数据。一个建议是像这样从索引中创建新列:

df['key_value'] = df.index

现在,您可以像任何其他列一样引用键值。如果您有一个更复杂的字典,则Pandas将为每个键/值对创建一列,这意味着您可能需要将数据框重构为更有用的形状。

最后,如果您想在某个时候转换为Numpy数组,则应该使用类似于apply的东西(假设df现在只是一个列表的单个列),因为每个单独的列表是数据框中的一个单元格。

df.apply(lambda x: np.array(x))

您将为数据框中的每一行获得一个numpy数组。希望这能帮到您。

2

使用for循环和list.append方法。将列表转换为数组非常简单,即np.array(L)

d = {"k": {"k1": [['v1']],"k2": [['v2']],"k3": [['v3']]}}

keys, values = [], []

for k1, v1 in d.items():
    for k2, v2 in v1.items():
        keys.append(k1+k2)
        values.append(v2[0][0])

print(keys, values, sep='\n')

['kk1', 'kk2', 'kk3']
['v1', 'v2', 'v3']

1
这是一种方法:
import numpy as np

d = {"k": {"k1": [['v1']],"k2": [['v2']],"k3": [['v3']]}}

lst = []
for k, v in d.items():
    for k1, v1 in v.items():
        lst.extend([(k+k1, v1[0][0])])

print(np.array(list(zip(*lst))))
# [['kk1' 'kk2' 'kk3']
#  ['v1' 'v2' 'v3']]                               

当我尝试使用lst.extend([(k+k1, v1[0][0])])时,会出现IndexError: list index out of range错误。然而,当我尝试使用lst.extend([(k+k1, v1)])时,它会存储该值,但不会转换为numpy数组,并显示以下错误消息:ValueError: setting an array element with a sequence。 - RAJKIRAN VELDUR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接