代码之家  ›  专栏  ›  技术社区  ›  ccsv

Numpy转置函数速度和用例

  •  0
  • ccsv  · 技术社区  · 7 年前

    那么为什么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()
    

    我做了一个 timeit Jupyter的两个项目:

    %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 回复  |  直到 7 年前
        1
  •  3
  •   Brad Solomon    7 年前

    一个原因可能是 np.transpose(a) 只是打电话而已 a.transpose() 内部,而 a、 转置() 更直接。在 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 类或任何第一个参数的类。

    (注: .T 与相同 .transpose() ,但如果数组具有<2个尺寸。)