【问题标题】:efficiently Iterating with numpy使用 numpy 有效地迭代
【发布时间】:2014-01-19 06:23:58
【问题描述】:

我编写了代码来计算数组 y 在周期 p 中每个元素的平均值

import numpy as np
p=4

y =np.asarray([146, 96, 59, 133, 192, 127, 79, 186, 272, 155, 98, 219])

c=len(y)/p
print c

a=[]
for i in range(1,c+1):
    s=y[p*(i-1):p*i]/np.mean(y[p*(i-1):p*i])
    a = np.append(a, s)
print a

b=[]
for i in range(c+1):
    s = np.mean(a[i::p])
    b = np.append(b, s)

print b

有没有比使用 append 和 for 循环更有效的方法来做到这一点?我不需要两个数组只是 b

【问题讨论】:

  • 要摆脱附加,使用 np.zeros(shape) 分配两个整数数组,然后分配给相关索引,您应该会看到性能提升。另外,这个脚本的最终目标是什么?这可能会帮助我们帮助您...
  • 可能,第二个范围也应该在 range(p) 中,因为您迭代模 p:a[i::p]。我更新了答案,最后一个结果等于你的预期 b,但比你的预期长一个,因为 c=3 但 p=4。
  • @MadisonMay 添加 Holt-Winters 指数平滑,用于计算季节
  • @user3084006 在我的回答中查看更新
  • @alko 这就是我正在做的事情。但是对于 Statsmodel。我用所有的乘法模型和阻尼变化得到了所有的双重和单一的。我会在完成三重和预测带后提交。

标签: python numpy iteration


【解决方案1】:

实际上,您执行的是 2d 操作。如果添加了第二个维度(例如使用重塑),则可以评估您的第一个数组 a:

z = y.reshape(-1, p)
w = z/z.mean(axis=1).reshape(-1,1)
print w.flatten()
# [ 1.34562212  0.88479263  0.5437788   1.22580645  1.31506849  0.86986301
#   0.54109589  1.2739726   1.46236559  0.83333333  0.52688172  1.17741935]

您的第二个 b 是先前结果的平均值:

print w.mean(axis=0)
# [ 1.37435207,  0.86266299,  0.53725214,  1.2257328 ]

更新

当您提到 cmets 中的指数平滑时,您可能会对处理时间序列的 pandasstatsmodels 包感兴趣。例如,在问题跟踪器中查看带有一些有用的 computational toolsthis ER 的 pandas 文档,以获取有关指数平滑实现的一些有用链接。

【讨论】:

猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 2019-06-14
  • 2018-12-25
  • 1970-01-01
  • 2020-10-15
  • 2015-06-12
  • 1970-01-01
  • 2014-08-07
相关资源
最近更新 更多