将 Python 嵌套 Dict 转换为 Numpy 数组
Convert Python nested Dict to Numpy array
我有一本字典,格式为:
{"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
这是一种方式:
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']]
我会为此使用 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 将为每个 key/value 对创建一个列,这意味着你可能必须将数据框融化成更有用的形状。
最后,如果您想要沿线某处转换为 numpy 数组,因为每个单独的列表都是数据框中的一个单元格,您应该使用类似 apply 的东西(假设 df 现在只是列表的一列)
df.apply(lambda x: np.array(x))
您将为数据框中的每一行取回一个 numpy 数组。希望这有帮助。
对 list.append
使用 for
循环。将列表转换为数组很简单,即 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']
我有一本字典,格式为:
{"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
这是一种方式:
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']]
我会为此使用 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 将为每个 key/value 对创建一个列,这意味着你可能必须将数据框融化成更有用的形状。
最后,如果您想要沿线某处转换为 numpy 数组,因为每个单独的列表都是数据框中的一个单元格,您应该使用类似 apply 的东西(假设 df 现在只是列表的一列)
df.apply(lambda x: np.array(x))
您将为数据框中的每一行取回一个 numpy 数组。希望这有帮助。
对 list.append
使用 for
循环。将列表转换为数组很简单,即 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']