Сделайте огромный выбор из нескольких массивов NumPy - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь преобразовать несколько массивов numpy в огромный словарь задач в python.Я уверен, что эта проблема была решена, но я не уверен, как искать такой результат.Ниже приведен пример того, что я пытаюсь выполнить.

Я путаюсь с циклами for и while в своих попытках.Если кто-то как относительно эффективный способ решения этой проблемы, в идеале, я хотел бы иметь возможность добавить как можно больше ключей к исходному дикту без изменения функции для генерации вывода.

#INPUT
initial = {
         'diameter': array([ 20.,  30.,  40.]),
         'medium': array([ 1, 1.5, 2]),
         'thickness': array([ 100, 150, 200]),
         'density': array([1])
         }

#OUTPUT
output = {
   "task1":{'id'=1, 'diameter':20, 'medium':1, 'thickness':100, 'density':1},
   "task2":{'id'=2, 'diameter':30, 'medium':1, 'thickness':100, 'density':1},
   "task3":{'id'=3, 'diameter':40, 'medium':1, 'thickness':100, 'density':1},
   "task4":{'id'=4, 'diameter':20, 'medium':1.5, 'thickness':100, 'density':1},
   "task5":{'id'=5, 'diameter':30, 'medium':1.5, 'thickness':100, 'density':1},

           ...

   "taskN":{'id'=N, 'diameter':40, 'medium':2, 'thickness':200, 'density':1},

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

initial = {
    'diameter': array([20.,  30.,  40.]),
    'medium': array([1, 1.5, 2]),
    'thickness': array([100, 150, 200]),
    'density': array([1])
}

def unpack(fields, data, acc):
    if not fields:
        yield acc
    else:
        field = fields.pop()
        for value in data[field]:
            acc[field] = value
            yield from unpack(fields, data, acc)
        fields.append(field)


fields = list(initial.keys())
for record in unpack(fields, initial, {}):
    print(record)

Результат похож на

{'density': 1, 'thickness': 100, 'medium': 1, 'diameter': 20.0}
{'density': 1, 'thickness': 100, 'medium': 1, 'diameter': 30.0}
{'density': 1, 'thickness': 100, 'medium': 1, 'diameter': 40.0}
{'density': 1, 'thickness': 100, 'medium': 1.5, 'diameter': 20.0}
{'density': 1, 'thickness': 100, 'medium': 1.5, 'diameter': 30.0}
{'density': 1, 'thickness': 100, 'medium': 1.5, 'diameter': 40.0}
{'density': 1, 'thickness': 100, 'medium': 2, 'diameter': 20.0}
{'density': 1, 'thickness': 100, 'medium': 2, 'diameter': 30.0}
{'density': 1, 'thickness': 100, 'medium': 2, 'diameter': 40.0}
...
0 голосов
/ 30 января 2019

Если окончательный порядок output не важен, вы можете добиться этого, используя itertools.product

from itertools import product

all_prods = product(*initial.values())
output = dict()
keys = ('id', *initial.keys())
count = 1

for prod in all_prods:
    vals = (count, *prod)
    ready = zip(keys, vals)
    output.update({'task{}'.format(count): dict(ready)})
    count += 1

output

{'task1': {'id': 1,
  'diameter': 20.0,
  'medium': 1.0,
  'thickness': 100,
  'density': 1},
 'task2': {'id': 2,
  'diameter': 20.0,
  'medium': 1.0,
  'thickness': 150,
  'density': 1},
 'task3': {'id': 3,
  'diameter': 20.0,
  'medium': 1.0,
  'thickness': 200,
  'density': 1},
...etc

Если порядок имеет значение, тогда мы должны предварительно отсортировать

from operator import itemgetter

initialize same variables as before...

for prod in sorted(all_prods, key=itemgetter(1,2)):
    same as before....


output

{'task1': {'id': 1,
  'diameter': 20.0,
  'medium': 1.0,
  'thickness': 100,
  'density': 1},
 'task2': {'id': 2,
  'diameter': 30.0,
  'medium': 1.0,
  'thickness': 100,
  'density': 1},
 'task3': {'id': 3,
  'diameter': 40.0,
  'medium': 1.0,
  'thickness': 100,
  'density': 1},
 'task4': {'id': 4,
  'diameter': 20.0,
  'medium': 1.0,
  'thickness': 150,
  'density': 1},
  ...etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...