【问题标题】:Iterating with numpy with different indexes使用具有不同索引的 numpy 进行迭代
【发布时间】:2014-01-15 14:04:03
【问题描述】:

假设我有一个使用范围的 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]

【问题讨论】:

  • 你应该使用 enumerate(y) 而不是 range(len(y)-1)
  • @Leifingson 我知道我刚刚做了这个例子。我实际上会使用 np.arange 对其进行矢量化

标签: python numpy iteration


【解决方案1】:

您在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 虽然我怀疑它在处理多维数组时更有用。对于您的一维数组,这可能是矫枉过正。尽管如此,如果速度变得至关重要,您可以阅读此文档,并在 cython 中解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2022-10-30
    • 1970-01-01
    相关资源
    最近更新 更多