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.
这是一种(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)