Whi*_*hir 7 python transpose numpy
我用随机数生成一个大矩阵(100x100,我们称之为X),使用numpy.matrix(),这样我就有了一个numpy.ndarray.
我一直想知道这两个操作之间是否有任何区别:
我已经在一个范围为1000的循环中测量了每个操作的时间,看起来XT明显快于numpy.transpose(X)
新增基准:
对于100x100矩阵,我得到了以下XT和numpy.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)
Run Code Online (Sandbox Code Playgroud)
最好的问候Whir
使用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 shape和strides,但是使用共享数据缓冲区(查看.__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两个函数调用.