有没有一种高效的函数来计算乘积?

3
我正在寻找一个 numpy 函数(或来自任何其他包的函数),它可以高效地评估。

enter image description here

其中f是一个向量值函数,其输入为向量x。乘积被视作简单的分量乘法。

问题在于每个x向量的长度以及要相乘的结果向量总数(xf)都非常大,数量级达到了百万级别。因此,无法一次性生成所有结果(它们无法适配内存),然后再使用np.multiply.reduce等方法进行乘法计算。

一种需要替换的代码的示例如下:

import numpy as np

x = np.ones(1000000)
prod = f(x)
for i in range(2, 1000000):
    prod *= f(i * np.ones(1000000))

假设 f 是一个向量值函数,其输出的维度等于输入的维度。

确切地说:我不是在寻找等效的代码,而是要一种高度优化的单个函数。有这样的东西吗?

对于那些熟悉 Wolfram Mathematica 的人:它将相当于 Product。在 Mathematica 中,我只需编写 Product[f[i ConstantArray[1,1000000]],{i,1000000}]


1
你能对数组 x 进行 f(x) 操作吗?或者 f 只能处理标量值?你的示例 np.sin(x) 可以处理数组输入。而另一种选择 math.sin(x) 只能处理标量。 - hpaulj
@chrisaycock,你的map表达式仅适用于Py2。 - hpaulj
@WarrenWeckesser 是的,我刚看到了。它必须与第二个示例相同。现在已经更正了。 - Sjoerd C. de Vries
假设它是FFT。 - Sjoerd C. de Vries
计算乘积通常受到内存带宽的限制。唯一要做的就是尽可能加快计算f(x)的速度,或将计算f(x)分成适合缓存的块。你能给出一个f(x)的现实世界例子吗? - max9111
显示剩余6条评论
1个回答

4

Numpy的ufuncs都有一个reduce方法。np.multiply是一个ufunc,所以只需要一行代码:

np.multiply.reduce(v)

在这里,v 是您以同样有效的方式计算的值的向量。

要计算向量,只需将函数应用于输入即可:

v = f(x)

所以,以你的例子为例:

np.multiply.reduce(np.sin(x))

备选方案

表达相同含义的更简单的方式是np.prod

np.prod(v)

您还可以直接在向量上使用prod方法:

v.prod()

我不确定我理解这个。在我的问题中,f不是一个矢量,而是一个函数,它根据循环的索引进行计算并返回一个矢量。 - Sjoerd C. de Vries
该函数是依赖于循环中的值还是值的索引? - hpaulj
函数始终相同,但对于不同的输入当然会产生不同的结果。 - Sjoerd C. de Vries
除了一个函数调用层级外,np.multiply.reducenp.prod 是相同的。 - hpaulj
更新没问题,因为我的回答是唯一的,我也不介意。通常情况下,你应该提出一个新问题,以避免使答案失效。 - Mad Physicist
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接