使用不同索引的numpy进行迭代

2024-04-20 06:05:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 方法innumpyforlenrange数组矢量化
1条回答
网友
1楼 · 发布于 2024-04-20 06:05:13

您在Iterating over a numpy array with enumerate like function中询问了类似的问题,只是AB没有改变。你知道吗

严格地说,你不能矢量化这个例子,因为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中实现该问题。你知道吗

相关问题 更多 >