下面的代码运行如此缓慢。我尝试使用numpy.argwhere而不是“ if语句”来加快代码的执行速度,并且得到了相当有效的结果,但是它仍然很慢。我也尝试了numpy.frompyfuncnumpy.vectorize,但是失败了。您建议如何加快下面的代码?

import numpy as np
import time

time1 = time.time()

n = 1000000
k = 10000

velos = np.linspace(-1000, 1000, n)
line_centers = np.linspace(-1000, 1000, k)
weights = np.random.random_sample(k)
rvs = np.arange(-60, 60, 2)

m = len(rvs)
w = np.arange(10)
M = np.zeros((n, m))
for l, lc in enumerate(line_centers):
    vi = velos - lc

    for j in range(m - 1):
        w = np.argwhere((vi < rvs[j + 1]) & (vi > rvs[j])).T[0]

        M[w, j] = weights[l] * (rvs[j + 1] - vi[w]) / (rvs[j + 1] - rvs[j])
        M[w, j + 1] = weights[l] * (vi[w] - rvs[j]) / (rvs[j + 1] - rvs[j])

time2 = time.time()

print(time2 - time1)


编辑:
数组M的大小不正确。我修好了它。

最佳答案

这似乎是c ++接口可以派上用场的情况。使用Pybind11,您可以创建将numpy数组作为参数的c ++函数,对其进行处理并将其返回给python。这样可以加快循环速度。看看吧!

10-07 12:35