2016-02-24 50 views
1

我有两个参数的Python函数,f(x,y),它返回一个标量。我也有两个可能参数np.arrayxsys。我想计算一个形状为(xs.size, ys.size)的二维numpy数组,其形式为f,其值为xsys之间的所有参数组合。结果应该等于获取函数评估的所有组合的矩阵

np.array([[f(x,y) for y in ys] for x in xs]) 

我希望尽可能有效地实现这一点,并利用多个处理器内核。 f没有任何副作用。我试图使用numpy.vectorize,但没有设法使用它达到预期的效果。例如。 numpy.outer正是我想要的特殊情况f=operator.__mul__

作为一个额外的警告,虽然可能不直接相关,但其中一个数组(例如ys)不包含数字,但包含scipy.interpolate.interp1d返回的对象。函数f通过这些插值计算一个定积分scipy.integrate.quad。结果矩阵仍然只包含数字。

+0

可能是你可以通过删除嵌套循环提高性能一点。例如,计算'xs'和'ys'的笛卡尔乘积,然后计算每次通过的'f'。这里是笛卡尔产品的代码(见公认的答案),它是快速的:http://stackoverflow.com/questions/1208118/using-numpy-to-build-an-array-of-all-combinations-of-two -arrays – Dataman

+3

看起来'scipy.interpolate.interp1d'返回的对象不能被腌渍,这对使用'multiprocessing'模块造成问题... –

+0

如果你改变这个标题,你可能会得到更好的答案题。问题是关于多处理,而不是组合。 – tom10

回答

1

假设f是一个Python函数,使用numpy.frompyfunc().outer()

np.frompyfunc(f, 2, 1).outer(xs, ys)