Как преобразовать словарь в массив numpy в python?

#python #dictionary

#python #словарь

Вопрос:

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

  import array as ar
 import numpy as np
 dict = {}
 for i in range(3): dict[i]=ar.array('I')
 dict[0]=np.array([1,2,3], dtype='int')
 dict[1]=np.array([], dtype='int')
 dict[2]=np.array([7,5], dtype='int')
  

И словарь в основном такой:

  0: 1,2,3
 1: []
 2: 7,5
  

И я хочу получить выходной массив, подобный этому:

  array([[0,0,0,2,2],[1,2,3,7,5]])
  

Итак, первая строка — это ключи в словаре, а вторая строка — соответствующие элементы в словаре. Если элементы пусты, удалите ключи в выходном массиве. Как сгенерировать массив из входных dict данных в python?

Комментарии:

1. @Vishnudev На самом деле у меня есть функция, ввод которой в основном является ключом, а вывод — массив, длина которого может варьироваться. Я запускаю функцию в цикле for (цикл по ключу), чтобы создать словарь. Я отвечаю на ваш вопрос?

Ответ №1:

Небольшое изменение в вашем ответе:

Измените res = np.vstack((aa, bb)) на res = np.array((aa, bb), dtype=int) .

 import array as ar
import numpy as np

#dict = {}

# why so difficult?

#for i in range(3):
#    dict[i]=ar.array('I')
#dict[0]=np.array([1,2,3], dtype='int')
#dict[1]=np.array([], dtype='int')
#dict[2]=np.array([7,5], dtype='int')

dict = {0: [1,2,3],
        1: [],
        2: [7,5]}

print(dict)

aa = np.hstack([[k]*len(v) for k,v in dict.items()])
bb = np.hstack([v for k,v in dict.items()])
res = np.array((aa, bb), dtype=int)

print(res)
  

Если требуется для тестирования, вы всегда можете добавить точку для dtype с плавающей запятой согласно… если вы напечатаете dict:

 dict = {0: [1,2,3.], # here 3. is float
        1: [],
        2: [7,5]}
  

В любом случае конечным результатом будет массив dtype «int».

Ответ №2:

У меня есть версия для цикла:

 aa = np.hstack([[k]*len(v) for k,v in dict.items()])
bb = np.hstack([v for k,v in dict.items()])
res = np.vstack((aa, bb))
  

Но это каким-то образом меняет значение dtype float64 . Я ищу лучшее решение.

Ответ №3:

Решение с for петлями:

 keys = []
values = []
for k, v in dict.items():
    for i in v:
        keys  = [k]
        values  = [i]
result = array([keys, values])
  

Решение без for циклов:

 w = [[[k]*len(v), v] for k, v in dict.items()]
result = array([[y for x in [q[0] for q in w] for y in x], [y for x in [q[1] for q in w] for y in x]])
  

Комментарии:

1. Есть ли способ избавиться от циклов for?

2. @ZF007 Я удалю вопросы, поскольку автор удалил свои ответы.

3. первый вопрос о вас здесь должен быть сохранен. В противном случае вторая часть ответа не имеет смысла.

4. Я не удалял свои ответы, это сделал кто-то или что-то еще!