那么,为什么NumPy的转置.T速度比np.transpose()?
.T
np.transpose()
b = np.arange(10) #Transpose .T t=b.reshape(2,5).T #Transpose function t = np.transpose(b.reshape(2,5)) #Transpose function without wrapper t = b.reshape(2,5).transpose()
我timeit在Jupyter中都做到了:
timeit
%timeit -n 1000 b.reshape(2,5).T 1000 loops, best of 3: 391 ns per loop %timeit -n 1000 np.transpose(b.reshape(2,5)) 1000 loops, best of 3: 600 ns per loop %timeit -n 1000 b.reshape(2,5).transpose() 1000 loops, best of 3: 422 ns per loop
为了检查可扩展性,我做了一个更大的矩阵:
b = np.arange( 100000000) %timeit -n 1000 b.reshape(10000,10000).T 1000 loops, best of 3: 390 ns per loop %timeit -n 1000 np.transpose(b.reshape(10000,10000)) 1000 loops, best of 3: 611 ns per loop %timeit -n 1000 b.reshape(10000,10000).transpose() 1000 loops, best of 3: 435 ns per loop
在这两种情况下,该.T方法的速度都比包装器快2倍,比使用包装器快.transpose()一点?有没有一种用例会np.transpose更好?
.transpose()
np.transpose
原因之一可能是内部np.transpose(a)调用a.transpose(),而a.transpose()直接调用。在源代码中,您有:
np.transpose(a)
a.transpose()
def transpose(a, axes=None): return _wrapfunc(a, 'transpose', axes)
哪里_wrapfunc又只是:
_wrapfunc
def _wrapfunc(obj, method, *args, **kwds): try: return getattr(obj, method)(*args, **kwds) except (AttributeError, TypeError): return _wrapit(obj, method, *args, **kwds)
getattr(a, 'transpose')在这种情况下,映射到。 _wrapfunc许多模块级函数使用来访问方法,通常是ndarray该类的方法或第一个arg的类。
getattr(a, 'transpose')
ndarray
(注意:.T与相同.transpose(),但如果数组的尺寸小于2,则返回该数组。)