numpy数组中没有for循环的字典列表

dur*_*2.0 6 python performance numpy vectorization

有没有办法对需要几个numpy数组并将它们放入字典列表的操作进行矢量化?

这是一个简化的例子.真实场景可能涉及更多数组和更多字典键.

import numpy as np
x = np.arange(10)
y = np.arange(10, 20)
z = np.arange(100, 110)

print [dict(x=x[ii], y=y[ii], z=z[ii]) for ii in xrange(10)]
Run Code Online (Sandbox Code Playgroud)

我可能在xrange通话中有数千或数十万次迭代.所有操作来创建x,y以及z被矢量(我的例子不是那么简单如上).因此,只有1个循环可以摆脱,我预计会导致巨大的加速.

我尝试使用map函数来创建字典和各种其他工作.似乎Python for循环是缓慢的部分(像往常一样).由于预先存在的API要求,我有点不习惯使用字典.但是,没有dicts和记录数组或其他东西的解决方案会很有趣,但最终我认为这不会适用于现有的API.

Kas*_*mvd 2

这是一种(Num)? Pythonic 方式:

In [18]: names = np.array(['x', 'y', 'z'])
In [38]: map(dict, np.dstack((np.repeat(names[None, :], 10, axis=0), np.column_stack((x, y, z)))))
Out[38]: 
[{'x': '0', 'y': '10', 'z': '100'},
 {'x': '1', 'y': '11', 'z': '101'},
 {'x': '2', 'y': '12', 'z': '102'},
 {'x': '3', 'y': '13', 'z': '103'},
 {'x': '4', 'y': '14', 'z': '104'},
 {'x': '5', 'y': '15', 'z': '105'},
 {'x': '6', 'y': '16', 'z': '106'},
 {'x': '7', 'y': '17', 'z': '107'},
 {'x': '8', 'y': '18', 'z': '108'},
 {'x': '9', 'y': '19', 'z': '109'}]
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您不需要一次需要所有词典,您可以简单地创建一个生成器并按需访问每个项目。

(dict(x=x[ii], y=y[ii], z=z[ii]) for ii in xrange(10))
Run Code Online (Sandbox Code Playgroud)

如果您想要嵌套字典,我建议使用列表理解:

In [88]: inner = np.dstack((np.repeat(names[None, :], 10, axis=0), np.column_stack((x, y))))

In [89]: [{'connection': d} for d in map(dict, inner)]
Out[89]: 
[{'connection': {'x': '0', 'y': '10'}},
 {'connection': {'x': '1', 'y': '11'}},
 {'connection': {'x': '2', 'y': '12'}},
 {'connection': {'x': '3', 'y': '13'}},
 {'connection': {'x': '4', 'y': '14'}},
 {'connection': {'x': '5', 'y': '15'}},
 {'connection': {'x': '6', 'y': '16'}},
 {'connection': {'x': '7', 'y': '17'}},
 {'connection': {'x': '8', 'y': '18'}},
 {'connection': {'x': '9', 'y': '19'}}]
Run Code Online (Sandbox Code Playgroud)

  • @durden2.0列表理解的`for`不像python的`for`循环,因为它的迭代已经在C中实现。但是如果你想在Numpy中做到这一点,因为你想要一个python对象,你的代码需要与上层(python)交互,这意味着您无法编写纯numpythonic代码。 (2认同)