Python 使用不同索引的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

假设我有一个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]矢量化

你在中问了一些类似的问题,只是那里
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来矢量化它