Numpy 转置函数速度和用例

Numpy transpose functions speed and use cases

那么为什么 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() 更直接。在 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 class 或第一个参数的 class。

(注意:.T.transpose() 相同,只是如果数组的维度小于 2,则返回数组。)