gpt4 book ai didi

python - 在 numpy 中更有效地矢量化此卷积类型循环

转载 作者:太空狗 更新时间:2023-10-29 21:50:32 27 4
gpt4 key购买 nike

我必须执行以下类型的许多循环

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 循环相比,向量太长了)。如果我在卷积中使用“相同”选项,我会得到中心部分,但我想要的是第一部分。当然,我可以从完整向量中去掉不需要的部分,但如果可能的话,我想去掉不必要的计算时间。有人可以建议更好的循环矢量化吗?

最佳答案

您可以在 Cython 中编写一个小的 C 扩展:

# cython: boundscheck=False
cimport numpy as np
import numpy as np # zeros_like

ctypedef np.float64_t np_t
def convolve_cy_np(np.ndarray[np_t] a not None,
np.ndarray[np_t] b not None,
np.ndarray[np_t] c=None):
if c is None:
c = np.zeros_like(a)
cdef Py_ssize_t i, j, n = c.shape[0]
with nogil:
for i in range(n):
for j in range(i + 1):
c[i] += a[j] * b[i - j]
return c

与我机器上的 np.convolve(a,b)[:len(a)] 相比,它在 n=10..50 上表现良好。

这似乎也是 numba 的工作.

关于python - 在 numpy 中更有效地矢量化此卷积类型循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12816293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com