python 中转置函数的差异

Differences of transpose functions in python

我正在生成一个带有随机数的大矩阵(100x100,我们称之为 X),numpy.matrix() 这样我就有了一个 numpy.ndarray.

我一直在想这两个操作有没有区别:

  1. numpy.transpose(X)
  2. X.T

我测量了循环中每个操作的时间,范围为 1000,似乎 X.T 明显快于 numpy.transpose(X)

添加的基准:

对于 100x100 矩阵,我得到以下结果 X.Tnumpy.tranpose(X)

在 10.000 范围循环中:

添加了下面的代码

    import numpy as np
    import time

    np_transpose_count = 0
    T_transpose_count = 0
    equal_count = 0

    for i in range(10000):
       Se = np.random.rand(100,100)

       tic1 =time.clock()
       ST_T = Se.T
       toc1=time.clock()

       tic2 =time.clock()
       ST_np = np.transpose(Se)
       toc2=time.clock()

       if (toc1-tic1) < (toc2-tic2):
           T_transpose_count+=1
       elif (toc1-tic1) > (toc2-tic2):
           np_transpose_count+=1
       else:
           equal_count+=1

    print(T_transpose_count, np_transpose_count, equal_count)

此致 呼呼

使用 Ipython %timeit 魔法我得到:

In [218]: X=np.ones((100,100))

In [219]: timeit X.T
1000000 loops, best of 3: 379 ns per loop

In [220]: timeit X.transpose()
1000000 loops, best of 3: 470 ns per loop

In [221]: timeit np.transpose(X)
1000000 loops, best of 3: 993 ns per loop

In [222]: timeit X+1
10000 loops, best of 3: 21.6 µs per loop

所以是的,.T 最快,函数最慢。但是将这些时间与简单加法的时间进行比较

或副本或切片

In [223]: timeit X.copy()
100000 loops, best of 3: 10.8 µs per loop

In [224]: timeit X[:]
1000000 loops, best of 3: 465 ns per loop

转置所有形式 returns 一个新的数组对象,具有新的 shapestrides,但具有共享数据缓冲区(查看 .__array_interface__ 字典看到那个)。因此,它与 return 和 view 的其他操作花费的时间大致相同。但是 none 的转置函数会复制数据或遍历数据。所以时差只是头顶调用的结果。

再次使用 ipython 魔法

np.transpose??
def transpose(a, axes=None):
    try:
        transpose = a.transpose
    except AttributeError:
        return _wrapit(a, 'transpose', axes)
    return transpose(axes)

所以 np.function(X) 最终调用 X.transpose().

我不得不查看 numpy 代码,但我记得 .T 是作为 attribute 实现的(与 property 不太一样)。我怀疑它更快,因为它不使用 axes 参数,因此节省了一两次 C 函数调用。