您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:22:29 python 字数 2591 阅读 577 来源 www.jb51.cc/python

我试图通过在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.]

概述

给出以下代码

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[1:] = 2*a[0:-1]
print a

我只是让第一次迭代正确:

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

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

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.,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,4])

In [273]: n = 5

In [274]: a0 * (alpha**np.arange(n).reshape(-1,1))
Out[274]: 
array([[  1.,32.],[ 16.,32.,48.,64.]])

总结

以上是编程之家为你收集整理的python – 尝试用numpy向量化迭代计算全部内容,希望文章能够帮你解决python – 尝试用numpy向量化迭代计算所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶