假设我有一个使用范围的for循环,如下所示。有没有一种好方法可以消除for循环并仅使用numpy数组?
y =[146, 96, 59, 133, 192, 127, 79, 186, 272, 155, 98, 219]
At=3
Bt=2
Aindex=[]
Bindex=[]
for i in range(len(y)-1):
A =At
B =Bt
At =y[i] / y[i] + 5 * (A + B)
Aindex.append(At)
Bt =(At - A) + y[i+1] * B
Bindex.append(Bt)
我会使用像
这样的东西c=len(y)-1
Aindex=y[:c]/y[:c]+5* (A + B)
但A和B在循环中更新。我也不知道如何在Bt方程中对y [i + 1]进行矢量化
答案 0 :(得分:0)
您在Iterating over a numpy array with enumerate like function中询问了类似内容,但A
和B
没有改变。
严格来说,由于Bt
中的更改,您无法对此案例进行矢量化。这是一个迭代问题,i+1
项取决于i
项。大多数numpy
向量运算一次在所有条件上运行(有效)。
您是否可以重做问题,以便使用cumsum
和/或cumprod
?这些是逐步通过向量(或数组的轴),计算累积和或产品的内置方法。 numpy's
概括为ufunc.accumulate
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.accumulate.html
与此同时,我建议更多地使用数组
y = np.array(y)
At = np.zeros(y.shape)
Bt = np.zeros(y.shape)
At[0] = 3
Bt[0] = 2
for i in range(len(y)-1):
A, B = At[i],Bt[i]
At[i+1] =y[i] / y[i] + 5 * (A + B)
Bt[i+1] =(At[i+1] - A) + y[i+1] * B
numpy
使用nditer
一起遍历多个数组(包括输出数组)。 http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html虽然我怀疑它在处理多维数组时更有用。对于你的1d阵列来说,它可能有点过分。如果速度变得至关重要,您仍然可以使用此文档,并在cython
中实现该问题。