我有一个密集调用的 numpy 操作,我需要优化:
np.sum(a**2, axis=1)**.5 # where a is a 2 dimensional ndarray
该操作由三个函数组成,需要迭代“a”三次。将所有操作聚合在一个函数下并沿轴 1 仅应用该函数一次会更有效。不幸的是,numpy 的沿轴应用 http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.apply_along_axis.html函数不是一个选项,因为性能大约差 1000 倍。
有没有一种方法可以聚合多个 numpy 操作,这样它只需在数组上循环一次?
使用浮点数组时,可以使用np.einsum http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html -
np.sqrt(np.einsum('ij,ij->i',a,a))
运行时测试 -
In [34]: a = np.random.rand(1000,1000)
In [35]: np.allclose(np.sum(a**2, axis=1)**.5,np.sqrt(np.einsum('ij,ij->i',a,a)))
Out[35]: True
In [36]: %timeit np.sum(a**2, axis=1)**.5
100 loops, best of 3: 7.57 ms per loop
In [37]: %timeit np.sqrt(np.einsum('ij,ij->i',a,a))
1000 loops, best of 3: 1.52 ms per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)