Конвертировать вложенный Dict Python в массив Numpy - PullRequest
0 голосов
/ 27 июня 2018

У меня есть словарь в формате:

{"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 ]

0 голосов
/ 28 июня 2018

Я бы использовал панды для этого. Сначала создайте фрейм данных из словаря.

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

Теперь вы можете ссылаться на значения ключа, как и на любой другой столбец. Если у вас есть более сложный словарь, панды создадут столбец для каждой пары ключ / значение, что означает, что вам, возможно, придется преобразовать фрейм данных в более полезную форму.

Наконец, если вы затем хотите преобразовать в пустой массив где-то вдоль строки, так как каждый отдельный список является ячейкой во фрейме данных, вы должны использовать что-то вроде apply (при условии, что df теперь это просто один столбец списков)

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

Для каждой строки в фрейме данных вы получите массив значений. Надеюсь, это поможет.

0 голосов
/ 28 июня 2018

Использование петли 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']
0 голосов
/ 27 июня 2018

Это один из способов:

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']]                               
...