我的方程式为:
其中a和b是大小为n和m的一维数组。我想避免在中间步骤中形成大小为n * m的任何东西,因为n和m都非常大,所需的内存太昂贵了。
一种解决方案是简单的python循环:
total = 0
for j in range(n):
total += a[j] * b**j
我正在寻找没有python循环的本机numpy解决方案。但是要解决没有python循环的问题,我无法找到一个numpy函数,该函数将不以[0 * b,b,b ** 2,b ** 3,...]的n×m数组作为输入形成
编辑:
正如hpaulj指出的那样,多项式解决方案可能会起作用。我发现了:
from numpy.polynomial import polynomial
total = polynomial.polyval(b, a)
这在快速测试中提供了相同的值,并且根据polyval上的注释,它使用了霍纳方法,并且似乎是最佳的。我的实际问题是两个维度上的总和,但是我认为这种解决方案会很普遍。
编辑2:
polyval似乎会导致
RuntimeWarning: overflow encountered in multiply c0 = c[-i] + c0*x
在小于np.outer的数组大小上会导致MemoryError。当它起作用时,它比python循环快得多。
编辑3:
忽略编辑1和2。使用python循环,以下命令(在我的机器上)运行更快。 polyval
似乎至少可以提高内存效率。
import numpy as np
from numpy.polynomial import polynomial
a_size = 3
b_size = 6
a = np.random.rand(10**a_size)
b = np.exp(2j * np.pi * np.random.rand(10**b_size))
start = time.time()
c = polynomial.polyval(b, a)
middle = time.time()
print(middle - start)
c2, b_current = 0, b**0
for i in range(0, a.size):
c2 += a[i] * b_current
b_current *= b
end = time.time()
print(end-middle)