понедельник, 21 мая 2012 г.

Реверсирование numpy-массива.


Допустим, имеется исходный массив a типа numpy.ndarray и требуется получить массив b, содержащий элементы массива а в обратном порядке.

1 вариант - через обратное индексирование.

import numpy as np
a = np.array([1,2,3])
b = a[np.arange(len(a)-1, -1, -1)]
print a
print b

2 вариант - через преобразование типов.

import numpy as np
a = np.array([1,2,3])
l = a.tolist()
l.reverse()
b = np.array(l)
print a
print b

3 вариант - посредством встроенной функции reversed

import numpy as np
a = np.array([1,2,3])
b = np.array([tmp for tmp in reversed(a)])
print a
print b

Первый и третий варианты представляются более привлекательными и изящными.

Поскольку в данном случае имеются 3 варианта выполнения задачи, целесообразно сравнить их по быстродействию. Для оценки быстродействия программ используем стандартный модуль timeit.

from timeit import timeit


startup = '''
import numpy as np
nel = 10
a = np.linspace(0, 10, nel)
'''


func1 = '''
b = a[range(len(a)-1, -1, -1)]
'''


func2 = '''
b = a.tolist()
b.reverse()
b = np.array(b)
'''


func3 = '''
b = np.array([tmp for tmp in reversed(a)])
'''


t1 = timeit(func1, startup)
t2 = timeit(func2, startup)
t3 = timeit(func3, startup)


print '%.4g\t%.4g\t%.4g' % (t1, t2, t3)

Для малого числа элементов массива (10 элементов), быстродействие всех трех вариантов оказывается примерно на одном уровне: время выполнения составляет 18.06, 14.81 и 18.68 для 1, 2 и 3 вариантов, соответственно.

Однако, для достаточно больших массивов (1000 элементов), разница в быстродействии 3-го варианта оказывается весьма существенной: время выполнения третьего варианта (612.7) превосходит время выполнения время выполнения первого и второго вариантов (272.8 и 208.4, соответственно) примерно в 2-3 раза.

Таким образом, второй вариант программы сортировки, несмотря на его некоторую неуклюжесть, оказался самым быстродействующим, что особенно выражено при применении данного варианта для реверсирования больших массивов данных.

Комментариев нет:

Отправить комментарий