从多个numpy数组中制作一个巨大的dict
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从多个numpy数组中制作一个巨大的dict相关的知识,希望对你有一定的参考价值。
我试图在python中的一个庞大的任务字典中转换多个numpy数组。我确信这个问题已经解决了,但我不确定如何搜索这样的结果。下面是我想要完成的一个例子。
在我的尝试中,我与for
和while
循环混淆了。如果有人作为一种相对有效的方法来解决这个问题,理想情况下,我希望能够在不更改函数的情况下为初始dict添加任意数量的键来生成输出。
#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},
答案
如果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
另一答案
您可以编写递归函数来枚举组合。这段代码示例并没有完成整个过程,但它让您了解如何构建输出字典。
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}
...
以上是关于从多个numpy数组中制作一个巨大的dict的主要内容,如果未能解决你的问题,请参考以下文章