我使用随机数生成一个大矩阵(100x100,我们称之为X),使用numpy.matrix()以便我有一个numpy.ndarray。
我一直想知道这两个操作之间是否有任何区别:
我已经在一个范围为1000的循环中测量了每个操作的时间,并且似乎 XT 明显快于 numpy.transpose(X)
添加了基准:
对于100x100矩阵,我使用 X.T 和 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)
祝你好运 呼呼
答案 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
以其所有形式进行转置,返回一个新的数组对象,使用新的shape
和strides
,但使用共享数据缓冲区(查看.__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代码,但我记得.T
是attribute
实现的(与property
不完全相同)。我怀疑它更快,因为它不使用axes
参数,因此保存了一两个C
函数调用。