【问题标题】:Numpy transpose functions speed and use casesNumpy 转置函数的速度和用例
【发布时间】:2018-01-29 20:45:01
【问题描述】:

那么为什么 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 更好的用例?

【问题讨论】:

  • 您不必担心transpose 的速度。这是一个微不足道的动作,只是改变形状和步伐。您看到的差异仅反映了调用结构。它们不随数组的大小而变化。
  • @hpaulj 为什么不呢?当您处理大型数据集时,每一点时间都会加起来。
  • @hpaulj 指的是转置只涉及操作描述数据布局的数组,而不是数据本身。此操作随维度的数量而变化,这比这些维度的大小要小得多。
  • np.transpose 也用于argwherereturn transpose(nonzero(a))。这里transpose 首先将数组的元组转换为二维数组。元组没有转置方法。 `

标签: python numpy transpose


【解决方案1】:

一个原因可能是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() 相同,只是如果数组有

【讨论】:

  • @Brad_Solomon 所以我尝试使用 .transpose() 但 .T 仍然更快,我会更新我的帖子
  • 我认为ndarray.transpose() 可能会稍微快一些,因为它需要一个axes 参数,而.T 没有。但它肯定不应该是 2 倍。
  • @Brad_Solomon 我猜 numpy 必须检查 axes 参数,这会在 .transpose() 而不是 .T 中产生更多开销,谢谢
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多