У меня есть 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, но мне все равно хотелось бы знать, как эффективно выполнить вышеизложенное, на случай, если это будет полезно позже ..
Если вы хотите выполнять все эти операции на месте, вам не нужен 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 Если у вас больше операций, чем просто мощность, вы всегда можете выполнить их отдельно, а затем переназначить результат. Единственная проблема с этим подходом может заключаться в потреблении памяти, когда ваши массивы настолько велики, что одна или две его копии могут поглотить память. В этом случае вы можете использовать ndarray.view
или изменить dtype на как можно более низкий lr, возможно, другие методы, которые не вписываются в комментарий. Тем не менее, если вы думали, что действительно не можете использовать операции на месте, вы можете задать другой вопрос по этому поводу.
если функция сложнее экспоненты, т.е. она нелинейная функция разницы между столбцами, можно ли использовать этот метод? Собственно сейчас пойду и протестирую .. спасибо