Различия функций транспонирования в python
я генерирую большую матрицу (100x100, назовем ее X) со случайными числами, с numpy.matrix() так что у меня есть numpy.ndarray.
мне было интересно, есть ли разница между двумя операциями:
- и NumPy.транспонировать (X)
- Х. Т
я измерил время каждой операции в цикле с дальностью 1000 и кажется, что Х. Т значительно быстрее чем и NumPy.транспонировать (X)
Добавлено Ориентиры:
для матрицы 100x100 я получил следующие результаты с Х. Т и и NumPy.tranpose (X)
в цикле диапазона 10.000:
- 7421/10.000: Х. Т быстрый
- 1256/10.000: и NumPy.транспонировать (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 ответов
Используя Оболочкой 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
Transpose во всех своих формах возвращает новый объект массива с new shape
и strides
, но с общим буфером данных (посмотрите на .__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
). Я подозреваю, что это быстрее, потому что он не использует