Допустим, имеется исходный массив 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 раза.
Таким образом, второй вариант программы сортировки, несмотря на его некоторую неуклюжесть, оказался самым быстродействующим, что особенно выражено при применении данного варианта для реверсирования больших массивов данных.
Комментариев нет:
Отправить комментарий