Python 使用不同索引的numpy进行迭代
假设我有一个for循环使用范围,如下所示。是否有一种消除for循环并仅使用numpy数组的好方法Python 使用不同索引的numpy进行迭代,python,numpy,iteration,Python,Numpy,Iteration,假设我有一个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
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]矢量化你在中问了一些类似的问题,只是那里
A
和B
没有改变
严格地说,您无法将此案例矢量化,因为Bt
中的更改。这是一个迭代问题,其中i+1
项取决于i
项。大多数numpy
向量操作(有效地)同时对所有项进行操作
您能否重新处理该问题,使其使用cumsum
和/或cumprod
?这些是通过向量(或数组轴)逐步计算累积和或积的内置方法numpy的
概括为ufunc.acculate
同时,我建议更多地使用数组
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
单步遍历多个数组(包括一个输出数组)。尽管我怀疑它在处理多维数组时更有用。对于1d阵列而言,这可能是一种过度杀伤力。但是,如果速度变得至关重要,您可以阅读此文档,并在cython
中实现问题。您应该使用enumerate(y)而不是range(len(y)-1)@Leifingson我知道我刚刚动态创建了示例。我实际上会使用np.arange来矢量化它