从多个numpy数组中制作一个巨大的dict

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从多个numpy数组中制作一个巨大的dict相关的知识,希望对你有一定的参考价值。

我试图在python中的一个庞大的任务字典中转换多个numpy数组。我确信这个问题已经解决了,但我不确定如何搜索这样的结果。下面是我想要完成的一个例子。

在我的尝试中,我与forwhile循环混淆了。如果有人作为一种相对有效的方法来解决这个问题,理想情况下,我希望能够在不更改函数的情况下为初始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的主要内容,如果未能解决你的问题,请参考以下文章

使用索引同时从 numpy 2D 数组的行中减去多个值

减少包含用于前端的 numpy 数组的编码 Python dict 的大小

如何将巨大的 2D NumPy 数组写入缓冲区

如何从 NumPy 数组中删除所有零元素?

一次从 numpy 数组中选择多个切片

C++ vs python numpy 复杂数组的性能