И вот один из них, использующий логическое индексирование Numpy напрямую:
import numpy as np
my_array = np.asarray([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
swap = np.array([0, 0, 1, 1, 0], dtype=bool)
my_array[swap, :] = my_array[swap,:][:,(1,0)]
Разбивка ключевой строки:
my_array[swap, :] =
означает «Назначить строки, где swap
истина " my_array[swap,:]
означает" выбрать всю строку, где swap
истина " [:,(1,0)]
означает" для каждой строки слева ", поменяйте местами столбцы 0 и 1 "
О" более эффективной "части вопроса ...
Общая настройка для всех тестов (начальное число гарантирует, что последовательности идентичны):
import timeit
setup= '''
import numpy as np
np.random.seed(42)
my_array = np.random.random([10000,2])
swap = np.random.random([10000]) > 0.5
'''
Все тесты выполняются за 1000 итераций
Исходный код: 5,621 секунды
timeit.timeit('swap_positions_conditionally(my_array, swap)', setup=setup, number=1000)
Добавлено определение от swap_positions_conditionally
до setup
, как показано в вопросе.
Этот ответ: 0,2657 секунды
timeit.timeit('my_array[swap, :] = my_array[swap,:][:,(1,0)]', setup=setup, number=1000)
Ответ Дивакара: 0,176 секунды
timeit.timeit('np.where(swap[:,None]!=1,my_array,my_array[:,::-1])', setup=setup, number=1000)
Первый ответ Yatu: 0,214 секунды
timeit.timeit('np.take_along_axis(my_array, np.c_[swap, 1-swap], axis=1)', setup=setup, number=1000)
Второй ответ Yatu : 0,2547 секунды
timeit.timeit('my_array[swap,:] = my_array[swap,::-1]', setup=setup, number=1000)
Выводы
Профилирование показывает, что версия Divakar является самой быстрой. Какой бы из интуитивно понятных или удобных для чтения файлов - вопрос вкусов, вы можете выбрать тот, который вы предпочитаете (хотя я лично являюсь поклонником читаемости индексации ...)