У меня есть массив формы (N, 3), и я хотел бы случайным образом перемешать строки.N составляет порядка 100 000.
Я обнаружил, что np.random.shuffle является узким местом моего приложения.Я попытался заменить shuffle вызовом np.random.choice и испытал ускорение в 10 раз.Что тут происходит?Почему так быстро вызывать np.random.choice?Создает ли версия np.random.choice равномерно распределенный случайный порядок?
import timeit
task_choice = '''
N = 100000
x = np.zeros((N, 3))
inds = np.random.choice(N, N, replace=False)
x[np.arange(N), :] = x[inds, :]
'''
task_shuffle = '''
N = 100000
x = np.zeros((N, 3))
np.random.shuffle(x)
'''
task_permute = '''
N = 100000
x = np.zeros((N, 3))
x = np.random.permutation(x)
'''
setup = 'import numpy as np'
timeit.timeit(task_choice, setup=setup, number=10)
>>> 0.11108078400138766
timeit.timeit(task_shuffle, setup=setup, number=10)
>>> 1.0411593900062144
timeit.timeit(task_permute, setup=setup, number=10)
>>> 1.1140159380011028
Редактировать: Для любого любопытного я решил использовать следующее решение, поскольку оно доступно для чтения и превосходит все другие методы в моих тестах производительности:
task_ind_permute = '''
N = 100000
x = np.zeros((N, 3))
inds = np.random.permutation(N)
x[np.arange(N), :] = x[inds, :]
'''