#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. Я не удалял свои ответы, это сделал кто-то или что-то еще!