Numpy 转置函数的速度和用例



那么为什么 NumPy 转置.Tnp.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()

我在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会更好的用例?

一个原因可能是np.transpose(a)只是在内部调用a.transpose(),而a.transpose()更直接。 在源中,您有:

def transpose(a, axes=None):
    return _wrapfunc(a, 'transpose', axes)

反过来_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 的类。

(注意:.T.transpose() 相同,只是如果数组具有 <2 维,则返回数组。

最新更新