小编tom*_*erg的帖子

使用 numpy.einsum 删除循环

我有一些嵌套循环(总共三个),我试图使用 numpy.einsum 来加速计算,但我正在努力使符号正确。我设法摆脱了一个循环,但我无法弄清楚另外两个。这是我到目前为止所得到的:

import numpy as np
import time

def myfunc(r, q, f):
    nr = r.shape[0]
    nq = q.shape[0]
    y = np.zeros(nq)
    for ri in range(nr):
        for qi in range(nq):
            y[qi] += np.einsum('i,i',f[ri,qi]*f[:,qi],np.sinc(q[qi]*r[ri,:]/np.pi))
    return y

r = np.random.random(size=(1000,1000))
q = np.linspace(0,1,1001)
f = np.random.random(size=(r.shape[0],q.shape[0]))

start = time.time()
y = myfunc(r, q, f)
end = time.time()

print(end-start)
Run Code Online (Sandbox Code Playgroud)

虽然这比原来快得多,但这仍然太慢,大约需要 30 秒。请注意,没有 einsum 调用的原始内容如下(看起来需要大约 2.5 小时,迫不及待地想确定):

def myfunc(r, q, f):
    nr = r.shape[0]
    nq = q.shape[0]
    y = np.zeros(nq)
    for ri in range(nr): …
Run Code Online (Sandbox Code Playgroud)

python performance numpy vectorization numpy-einsum

8
推荐指数
1
解决办法
193
查看次数

标签 统计

numpy ×1

numpy-einsum ×1

performance ×1

python ×1

vectorization ×1