python – 尝试用numpy向量化迭代计算
发布时间:2020-12-16 23:09:54 所属栏目: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.] [ 4. 8. 12. 16.]
我试图通过在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[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.,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.]]) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |