python中转置函数的差异

2024-10-04 01:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我用随机数生成一个大矩阵(100x100,我们称之为X),用numpy.matrix公司()这样我就有了努比·恩达雷. 在

我一直在想这两种操作之间是否有区别:

  1. 纽比转置(十)
  2. X.T

我在1000范围内测量了每个操作的时间,似乎X.T明显快于纽比转置(十)

增加了基准:

对于一个100x100矩阵,我得到了以下结果:X.Tnumpy.Transpose公司(十)

在10000范围循环中:

  • 7421/10.000:X.T最快
  • 1256/10000:纽比转置(十) 最快
  • 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)

谨致问候 呼呼


Tags: numpytimecountnp时间公司矩阵equal
1条回答
网友
1楼 · 发布于 2024-10-04 01:26:38

使用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最快,函数最慢。但是把这些时间和简单加法的时间比较一下

或者复制品或切片

^{pr2}$

所有形式的Transpose都返回一个新的数组对象,带有新的shape和{},但是有一个共享的数据缓冲区(查看.__array_interface__字典可以看到这一点)。因此,它与返回view的其他操作花费的时间差不多。但是没有一个转置函数复制或遍历数据。所以时间差只是因为打过头电话造成的。在

再次使用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函数调用。在

相关问题 更多 >