寻找内存有效的外部积和

时间:2019-01-20 20:55:02

标签: python numpy

我的方程式为:

enter image description here

其中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)

0 个答案:

没有答案