我正在寻求并行处理一个函数,该函数采用数字输入值的多个一维范围(形式为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
因此,在这里我将使用dask来并行化函数range_search
。理想情况下,这可以通过创建一个简单的网格来完成,然后可以对其进行分块,然后使用多线程或多核处理将其映射到我们的成本函数。查看dask文档,似乎dask.array没有包含任何合适的机制来实现此目的。从numpy库扩展了dask.array.meshgrid函数,但这不支持分块。此外,dask.array似乎没有包含并行映射功能。但是,dask.bag中有一个。但是文档似乎建议dask.bag仅用作执行原始数据(以CSV,JSON等格式)的初步处理的模块。 Dask.bag对象也确实有一个名为product()的方法,该方法似乎模仿itertools.product;。但是,这仅需要使用另一个dask.bag对象作为参数。因此,对5个数组进行网格划分需要这种称为“堆叠”(4次)的方法,除了丑陋的丑陋外,当输入数量可变时,该方法也无效。
从这里开始,我真的不知道该去哪里。我已经研究过通过汇总的Jupyter笔记本,但是它们似乎并没有解决我的问题。对于上述形式的并行化功能的最佳方法的任何建议,将不胜感激。
答案 0 :(得分:0)
我会为此使用Numpy Slicing
a[:, None, None] + b[None, :, None] + c[None, None, :]
您将要确保输入向量足够精细地分块,以便它们的乘积仍可以舒适地容纳在内存中。