Loops numpy中如何优化指数迭代

Loops numpy中如何优化指数迭代,loops,numpy,exponential,exponent,Loops,Numpy,Exponential,Exponent,假设我有以下numpy数组 n = 50 a = np.array(range(1, 1000)) / 1000. 我想执行这行代码 %timeit v = [a ** k for k in range(0, n)] 1000 loops, best of 3: 2.01 ms per loop 然而,这行代码最终将在循环中执行,因此我有性能问题 有没有办法优化循环?例如,列表理解中特定计算的结果i只是循环中先前计算结果的结果,再次乘以a 我不介意将结果存储在2d数组中,而不是列表中的数组。

假设我有以下
numpy数组

n = 50
a = np.array(range(1, 1000)) / 1000.
我想执行这行代码

%timeit v = [a ** k for k in range(0, n)]
1000 loops, best of 3: 2.01 ms per loop
然而,这行代码最终将在循环中执行,因此我有性能问题

有没有办法优化循环?例如,列表理解中特定计算的结果
i
只是循环中先前计算结果的结果,再次乘以
a

我不介意将结果存储在2d数组中,而不是列表中的数组。那可能会更干净。顺便说一句,我也尝试了以下方法,但它产生了类似的性能结果:

    k = np.array(range(0, n))
    ones = np.ones(n)
    temp = np.outer(a, ones)
然后执行以下计算

%timeit temp ** k
1000 loops, best of 3: 1.96 ms per loop


但两者产生的结果与上面的列表相似。顺便说一句,
n
在我的例子中总是一个
整数。

在快速测试中
cumprod
似乎更快

In [225]: timeit v = np.array([a ** k for k in range(0, n)])
2.76 ms ± 1.62 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [228]: %%timeit 
     ...: A=np.broadcast_to(a[:,None],(len(a),50))
     ...: v1=np.cumprod(A,axis=1)
     ...: 
208 µs ± 42.3 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
要比较值,我必须调整范围,因为
v
包含0次幂,而
v1
以1次幂开始:

In [224]: np.allclose(np.array(v)[1:], v1.T[:-1])
Out[224]: True
但时间安排表明,
cumprod
值得改进


拟议的副本已被批准。这仍然有很多好主意。

谢谢,我使用了np.vander和你的答案的混合来创建我需要的东西。事实上,我需要计算维德蒙德矩阵,但用你的答案,我可以做得更快。最后,我所做的就是将1d数组1添加到第一列:
v1=np.insert(v1,0,np.ones(len(a)),axis=1)
In [224]: np.allclose(np.array(v)[1:], v1.T[:-1])
Out[224]: True