我正在寻求并行处理一个函数,该函数采用多个一维范围(形式为np.linspace(x,y,t)
)的数字输入值(此变量是变量,但可以说需要五个),在这些范围之外创建网格,然后求值一些(5维)成本函数,用于此网格。在当前形式下,它看起来像这样:
def func_5d(a,b,c,d,e):
return a + b + c + d + e
def range_search(a_range, b_range, c_range, d_range, e_range):
mesh = itertools.product(a_range, b_range, c_range, d_range, e_range)
func_eval = map(lambda x: (func_5d(np.array(x)), x), mesh)
return func_eval
所以,在这里我要并行化功能 range_search
使用dask。理想情况下,这可以通过创建一个简单的网格来完成,然后可以对其进行分块,然后使用多线程或多核处理将其映射到我们的成本函数。查看dask文档,似乎dask.array没有包含任何合适的机制来实现此目的。从numpy库扩展了dask.array.meshgrid函数,但这不支持分块。此外,dask.array似乎没有包含并行映射功能。但是,dask.bag中有一个。但是文档似乎建议dask.bag仅用作执行原始数据(以CSV,JSON等格式)的初步处理的模块。Dask.bag对象也确实有一个名为product()的方法,该方法似乎模仿itertools.product;。但是,这仅需要其他一项。bag对象作为参数。因此,对5个数组进行网格划分需要这种称为“堆叠”(4次)的方法,除了丑陋的丑陋外,当输入数量可变时,该方法也无效。
从这里,我真的不知道该去哪里。我已经完成了很多草草的Jupyter笔记本的工作,但是它们似乎并没有解决我的问题。对于上述形式的并行化功能的最佳方法的任何建议,将不胜感激。
我会为此使用Numpy Slicing
a[:, None, None] + b[None, :, None] + c[None, None, :]
您将要确保将输入向量精巧地分块,以使它们的乘积仍能舒适地容纳在内存中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句