Numpy转置功能速度和用例

时间:2018-01-29 20:45:01

标签: python numpy transpose

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

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

1 个答案:

答案 0 :(得分:3)

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

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

_wrapfunc依次为is just

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维,则返回该数组。)