Индексирование 2D-массива Numpy другим 2D-вдоль определенной оси

У меня есть 2D-массив:

>>> in_arr = np.array([[1,2],[4,3]])
array([[1, 2],
       [4, 3]])

и я нахожу отсортированные индексы по столбцам, чтобы получить еще один 2D-массив:

>>> col_sort = np.argsort(in_arr, axis=1)
array([[0, 1],
       [1, 0]])

Я хотел бы знать эффективный срез numpy для индексации первого вторым:

>>> redordered_in_arr = np.*SOME_SLICE_METHOD*(in_arr, col_sort, axis=1)
array([[1, 2],
       [3, 4]])

Намерение состоит в том, чтобы затем выполнить (более сложную) функцию для массива по столбцам, например:

>>> arr_with_function = reordered_in_arr ** np.array([1,2])
array([[1, 4],
       [3, 16]])

и вернуть элементы в исходное положение в массиве

>>> return_order = np.argsort(col_sort, axis=1)
>>> redordered_in_arr = np.*SOME_SLICE_METHOD*(arr_with_function, return_order, axis=1)
array([[1, 4],
       [16, 3]]) 

Хорошо, поэтому, думая об этом, когда я печатаю, я мог бы просто использовать apply_over_axis, но мне все равно хотелось бы знать, как эффективно выполнить вышеизложенное, на случай, если это будет полезно позже ..

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите выполнять все эти операции на месте, вам не нужен argsort(). Numpy поддерживает операции на месте в таких ситуациях:

In [12]: in_arr = np.array([[1,2],[4,3]])

In [13]: in_arr.sort(axis=1)

In [14]: in_arr **= [1, 2]

In [15]: in_arr
Out[15]: 
array([[ 1,  4],
       [ 3, 16]])

Но если вам нужны индексы отсортированных элементов, вы можете получить ожидаемый результат с помощью простой индексации.

In [18]: in_arr[np.arange(2)[:,None], col_sort]
Out[18]: 
array([[1, 2],
       [3, 4]])

если функция сложнее экспоненты, т.е. она нелинейная функция разницы между столбцами, можно ли использовать этот метод? Собственно сейчас пойду и протестирую .. спасибо

Attack68 02.05.2018 09:49

@ Attack68 Если у вас больше операций, чем просто мощность, вы всегда можете выполнить их отдельно, а затем переназначить результат. Единственная проблема с этим подходом может заключаться в потреблении памяти, когда ваши массивы настолько велики, что одна или две его копии могут поглотить память. В этом случае вы можете использовать ndarray.view или изменить dtype на как можно более низкий lr, возможно, другие методы, которые не вписываются в комментарий. Тем не менее, если вы думали, что действительно не можете использовать операции на месте, вы можете задать другой вопрос по этому поводу.

kasravnd 02.05.2018 09:59

Другие вопросы по теме