改进2D余弦函数的numpy功能



我有功能代码,但我想在两个方面得到帮助:

  1. 改进numpy代码,使代码运行得更快(即不要用于循环(

我想先问一下数字1。以下是我正在查询的代码片段:

import numpy as np
k = np.linspace(0,4.76*10,2400)
kx,ky = np.meshgrid(k, k)
rx = [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]
ry = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2]
tensx = np.tensordot(rx,kx, axes = 0)
tensy = np.tensordot(ry,ky, axes = 0)
z = 0
for i in range(0, len(tensx)):
z = z + 0.05*np.cos(2*np.pi*(tensx[i]+tensy[i]))

代码目前不是,但当我开始增加rx和ry向量中的点数时,它会慢得多。所以我的问题是:;numpy er";如何编写此代码?

非常感谢您的帮助!

您可以将for循环重写为:

0.05*np.cos(2*np.pi*(tensx+tensy[:-1])).sum(axis=0)

或者更一般地说:

0.05*np.cos(2*np.pi*(tensx+tensy[:tensx.shape[0]])).sum(axis=0)

您还可以通过执行以下操作来避免meshgrid,避免计算tensy的未使用元素:

tensx = np.tensordot(rx, k[None, :], axes=0)
tensy = np.tensordot(ry[:len(rx)], k[:, None], axes=0)

时间安排:

def op():
k = np.linspace(0,4.76*10,2400)
kx,ky = np.meshgrid(k, k)
rx = [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]
ry = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2]
tensx = np.tensordot(rx,kx, axes = 0)
tensy = np.tensordot(ry,ky, axes = 0)
z = 0
for i in range(0, len(tensx)):
z = z + 0.05*np.cos(2*np.pi*(tensx[i]+tensy[i]))
return z
def Nin17():
k = np.linspace(0,4.76*10,2400)
rx = [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]
ry = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2]
tensx = np.tensordot(rx, k[None, :], axes=0)
tensy = np.tensordot(ry[:len(rx)], k[:, None], axes=0)
return 0.05*np.cos(2*np.pi*(tensx+tensy)).sum(axis=0)
assert np.isclose(Nin17(), op()).all()
%timeit Nin17()
%timeit op()

输出:

359 ms ± 2.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
410 ms ± 5.47 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

最新更新