【发布时间】:2012-09-30 17:51:42
【问题描述】:
我必须做许多以下类型的循环
for i in range(len(a)):
for j in range(i+1):
c[i] += a[j]*b[i-j]
其中 a 和 b 是短数组(大小相同,大约在 10 到 50 之间)。这可以使用卷积有效地完成:
import numpy as np
np.convolve(a, b)
但是,这给了我完整的卷积(即,与上面的 for 循环相比,向量太长了)。如果我在卷积中使用“相同”选项,我会得到中心部分,但我想要的是第一部分。当然,我可以从整个向量中去掉我不需要的东西,但如果可能的话,我想去掉不必要的计算时间。 有人可以建议对循环进行更好的矢量化吗?
【问题讨论】:
-
如果数组很短,那何必呢?这是您代码中的瓶颈吗?
-
@larsmans 是的,这是瓶颈。我知道这可能看起来不多,但原则上我认为加速可能是 2 倍,这会很棒。此外,如果有人想用更大的数组来做这件事可能会很有趣。
-
“短”有多短,输入是静态的吗?
-
@mtrw sorry 应该指定这个 - 在 10 到 50 之间(有问题的编辑)。每次调用的一个输入都会改变,另一个保持不变,所以我想它可以设为静态?
-
你可以考虑使用
scipy提供的卷积功能:docs.scipy.org/doc/scipy/reference/generated/…
标签: python performance numpy vectorization