python中转置函数的差异

时间:2016-05-24 08:53:30

标签: python numpy transpose

我使用随机数生成一个大矩阵(100x100,我们称之为X),使用numpy.matrix()以便我有一个numpy.ndarray。

我一直想知道这两个操作之间是否有任何区别:

  1. numpy.transpose(X)
  2. X.T
  3. 我已经在一个范围为1000的循环中测量了每个操作的时间,并且似乎 XT 明显快于 numpy.transpose(X)

    添加了基准:

    对于100x100矩阵,我使用 X.T numpy.tranpose(X)

    得到以下结果

    在10.000范围循环中:

    • 7421 / 10.000: X.T 最快
    • 1256 / 10.000: numpy.transpose(X)最快
    • 1323 / 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)
    

    祝你好运 呼呼

1 个答案:

答案 0 :(得分:5)

使用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

以其所有形式进行转置,返回一个新的数组对象,使用新的shapestrides,但使用共享数据缓冲区(查看.__array_interface__字典以查看)。因此,与返回view的其他操作大致相同。但是没有一个转置函数可以复制数据或通过它进行迭代。所以时间差异只是呼唤头脑的结果。

再次使用ipython magic

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代码,但我记得.Tattribute实现的(与property不完全相同)。我怀疑它更快,因为它不使用axes参数,因此保存了一两个C函数调用。