python中转置函数的差异

Whi*_*hir 7 python transpose numpy

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

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

  1. numpy.transpose(X)
  2. XT

我已经在一个范围为1000的循环中测量了每个操作的时间,看起来XT明显快于numpy.transpose(X)

新增基准:

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

在10.000范围循环中:

  • 7421/10.000:XT最快
  • 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)
Run Code Online (Sandbox Code Playgroud)

最好的问候Whir

hpa*_*ulj 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
Run Code Online (Sandbox Code Playgroud)

所以是的,.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
Run Code Online (Sandbox Code Playgroud)

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

再次用ipython魔法

np.transpose??
def transpose(a, axes=None):
    try:
        transpose = a.transpose
    except AttributeError:
        return _wrapit(a, 'transpose', axes)
    return transpose(axes)
Run Code Online (Sandbox Code Playgroud)

所以np.function(X)最终打电话X.transpose().

我必须查看numpy代码,但我记得它.T是作为一个attribute(与a不完全相同property)实现的.我怀疑它更快,因为它不使用axes参数,因此保存了一C两个函数调用.