gpt4 book ai didi

python - 尝试用 numpy 向量化迭代计算

转载 作者:太空狗 更新时间:2023-10-29 21:34:18 25 4
gpt4 key购买 nike

我试图通过在 numpy 中使用矢量化形式来提高一些代码的效率。让我举个例子,让您明白我的意思。

给定以下代码:

a = np.zeros([4,4])
a[0] = [1., 2., 3., 4.]
for i in range(len(a)-1):
a[i+1] = 2*a[i]
print a

输出

[[  1.   2.   3.   4.]
[ 2. 4. 6. 8.]
[ 4. 8. 12. 16.]
[ 8. 16. 24. 32.]]

当我现在尝试像这样矢量化代码时:

a = np.zeros([4,4])
a[0] = [1., 2., 3., 4.]
a[1:] = 2*a[0:-1]
print a

我只是得到了第一次迭代的正确结果:

[[ 1.  2.  3.  4.]
[ 2. 4. 6. 8.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]

是否有可能以矢量化形式高效地编写上面的代码(下一次迭代总是访问上一次迭代)或者我是否必须保留 for 循环?

最佳答案

可以使用 scipy.signal.lfilter 计算此类线性递归:

In [19]: from scipy.signal import lfilter

In [20]: num = np.array([1.0])

In [21]: alpha = 2.0

In [22]: den = np.array([1.0, -alpha])

In [23]: a = np.zeros((4,4))

In [24]: a[0,:] = [1,2,3,4]

In [25]: lfilter(num, den, a, axis=0)
Out[25]:
array([[ 1., 2., 3., 4.],
[ 2., 4., 6., 8.],
[ 4., 8., 12., 16.],
[ 8., 16., 24., 32.]])

有关详细信息,请参阅以下内容:python recursive vectorization with timeseries , Recursive definitions in Pandas


请注意,使用 lfilter只有在解决非齐次问题(例如 x[i+1] = alpha*x[i] + u[i])时才真正有意义, 其中u是给定的输入数组。对于简单的重复 a[i+1] = alpha*a[i] , 你可以使用精确解 a[i] = a[0]*alpha**i .可以使用广播对多个初始值的解决方案进行矢量化。例如,

In [271]: alpha = 2.0

In [272]: a0 = np.array([1, 2, 3, 4])

In [273]: n = 5

In [274]: a0 * (alpha**np.arange(n).reshape(-1, 1))
Out[274]:
array([[ 1., 2., 3., 4.],
[ 2., 4., 6., 8.],
[ 4., 8., 12., 16.],
[ 8., 16., 24., 32.],
[ 16., 32., 48., 64.]])

关于python - 尝试用 numpy 向量化迭代计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27568462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com