Хотите верьте, хотите нет, но после профилирования моего текущего кода повторяющаяся операция возврата массивов клочков съела гигантский кусок времени выполнения. Сейчас у меня есть общий метод, основанный на представлении:
reversed_arr = arr[::-1]
Есть ли какой-то другой способ сделать это более эффективно, или это просто иллюзия из-за моей одержимости нереальным выступлением?
arr[::-1]
просто возвращает перевернутое представление. Это так быстро, как вы можете получить, и не зависит от количества элементов в массиве, поскольку это просто меняет шаги. Является ли то, что вы изменили на самом деле массивом?arr
это массив NumPy.f2py
твой друг! Часто стоит написать критичные к производительности части алгоритма (особенно в научных вычислениях) на другом языке и вызвать его из python. Удачи!arr[::-1]
: github.com/numpy/numpy/blob/master/numpy/lib/twodim_base.py . Ищитеdef flipud
. Функция буквально в четыре строки.Ответы:
При создании
reversed_arr
вы создаете представление в исходном массиве. Затем вы можете изменить исходный массив, и представление обновится, чтобы отразить изменения.Вы воссоздаете представление чаще, чем нужно? Вы должны быть в состоянии сделать что-то вроде этого:
Я не эксперт в NumPy, но похоже, что это будет самый быстрый способ сделать все в NUMPY. Если это то, что вы уже делаете, я не думаю, что вы можете улучшить это.
PS Отличная дискуссия о numpy взглядах здесь:
Посмотреть на массив NumPy?
источник
look_at
должна делать функция?reversed_arr
представление все еще можно использовать после изменения базовых данных. Запись новых значений в массив не лишает законной силы представление. На самом деле вы также можете использовать представление для записи новых значений в массив.reversed_arr[0] = 99
установил бы последний элемент в массиве на 99, так же какarr[-1] = 99
и.Как упоминалось выше, на
a[::-1]
самом деле создается только представление, поэтому это операция с постоянным временем (и, как таковая, не занимает больше времени при увеличении массива). Если вам нужно, чтобы массив был смежным (например, потому что вы выполняете с ним много векторных операций),ascontiguousarray
это примерно так же быстро, какflipup
/fliplr
:Код для генерации сюжета:
источник
Потому что это, кажется, еще не помечено как ответ ... Ответ Томаса Арилдсена должен быть правильным: просто используйте
если это массив 1d (массив столбцов).
С матрицами делаю
если вы хотите перевернуть строки и
flipud(matrix)
перевернуть столбцы. Нет необходимости превращать массив из 1d-столбца в двухмерный массив строк (матрица с одним None-слоем), а затем переворачивать его.источник
np.fliplr()
переворачивает массив слева направо.Обратите внимание, что для 1d-массивов вам нужно немного его обмануть:
источник
reversed_arr = np.flipud(arr1d)
кажется, работает напрямую.Я остановлюсь на более раннем ответе о
np.fliplr()
. Вот некоторый код, который демонстрирует создание 1d-массива, преобразование его в 2-мерный массив, переворачивание и последующее преобразование обратно в 1-мерный массив.time.clock()
будет использоваться для хранения времени, которое представлено в секундах.С заявлением на печать без комментариев:
С заявлением о печати закомментировано:
Так что, с точки зрения эффективности, я думаю, что это достойно. Для тех из вас, кто любит делать это в одной строке, вот эта форма.
источник
Подробно о том, что сказали другие, приведу короткий пример.
Если у вас есть одномерный массив ...
Но если вы работаете с 2D-массивом ...
Это на самом деле не переворачивает Матрицу.
Следует использовать np.flip для реверсирования элементов
Если вы хотите распечатать элементы матрицы по одному, используйте плоскую и флип
источник
Чтобы он работал с отрицательными числами и длинным списком, вы можете сделать следующее:
Где flipud для 1d arra
источник