【发布时间】:2018-01-29 20:45:01
【问题描述】:
那么为什么 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 更好的用例?
【问题讨论】:
-
您不必担心
transpose的速度。这是一个微不足道的动作,只是改变形状和步伐。您看到的差异仅反映了调用结构。它们不随数组的大小而变化。 -
@hpaulj 为什么不呢?当您处理大型数据集时,每一点时间都会加起来。
-
@hpaulj 指的是转置只涉及操作描述数据布局的数组,而不是数据本身。此操作随维度的数量而变化,这比这些维度的大小要小得多。
-
np.transpose也用于argwhere、return transpose(nonzero(a))。这里transpose首先将数组的元组转换为二维数组。元组没有转置方法。 `