Как перевернуть массив numpy неизвестного размера? - PullRequest
4 голосов
/ 19 июня 2020
• 1000 операция, но без обращения времени одной из функций.

Итак, в моем исходном проекте java я просто написал весь код, чтобы выполнить операцию самостоятельно, так как я работаю в python, и у него есть отличные математические библиотеки, такие как numpy и scipy, я подумал, что могу просто использовать существующую функцию свертки, например scipy.convolve. Однако это потребовало бы, чтобы я предварительно перевернул один из двух массивов, чтобы, когда scipy.convolve запускается и меняет один из массивов для выполнения свертки, он действительно не реверсирует массив. (Я также до сих пор не знаю, как я могу быть уверен, что предварительно переверну правый из двух массивов, чтобы два массива по-прежнему скользили друг мимо друга вперед, а не назад, но я предполагаю, что я должен спросить об этом как отдельный вопрос.)

В отличие от моего java кода, который обрабатывал только одномерные данные, я хотел расширить этот проект до многомерных данных. Итак, хотя я узнал, что если бы у меня был массив numpy известной размерности, такой как трехмерный массив a, я мог бы полностью перевернуть массив (или, скорее, вернуть обратное представление, что намного быстрее) , by

a = a(::-1, ::-1, ::-1)

Однако для этого мне нужно иметь ::-1 для каждого измерения. Как я могу выполнить такое же обращение в методе для массива произвольной размерности, который имеет тот же результат, что и приведенный выше код?

Ответы [ 2 ]

4 голосов
/ 19 июня 2020

Вы можете использовать np.flip. Из документации:

numpy.flip(m, axis=None)

Изменение порядка элементов в массиве на противоположное по заданной оси.

Форма массива сохраняется, но элементы переупорядочены.

Примечание: flip(m) соответствует m[::-1,::-1,...,::-1] с ::-1 во всех позициях.

0 голосов
/ 19 июня 2020

Это возможное решение:

slices = tuple([slice(-1, -n-1, -1) for n in a.shape])
result = a[slices]

распространяется на произвольное количество осей. Проверка:

a = np.arange(8).reshape(2, 4)
slices = tuple([slice(-1, -n-1, -1) for n in a.shape])
result = a[slices]

дает:

>>> a
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
>>> result
array([[7, 6, 5, 4],
       [3, 2, 1, 0]])
...