#python #numpy
#python #массивы #numpy #numpy-ndarray
Вопрос:
У меня есть 2D-массив numpy из 2D точек:
np.random.seed(0)
a = np.random.rand(3, 4, 2) # each value is a 2D point
Я хотел бы отсортировать каждую строку по норме каждой точки
norms = np.linalg.norm(a, axis=2) # shape(3, 4)
indices = np.argsort(norms, axis=0) # indices of each sorted row
Теперь я хотел бы создать массив с той же формой и значениями, a
что и . при этом каждая строка 2D-точек будет отсортирована по их норме.
Как я могу этого добиться?
Я пробовал варианты np.take amp; np.take_along_axis, но безуспешно.
например:
np.take(a, indices, axis=1) # shape (3,3,4,2)
Это a
выполняется 3 раза, по одному разу для каждой строки indices
.
Я хотел бы попробовать a
только один раз. каждая строка indices
содержит столбцы, которые должны быть выбраны из соответствующей строки.
Комментарии:
1. Какие варианты вы пробовали и почему они не увенчались успехом?
2. Я буду рад назначить повторное открытие и опубликовать ответ, когда вы исправите вопрос
3. @MadPhysicist Я отредактировал вопрос с примером и разъяснением. надеюсь, теперь все ясно.
4. @NinaKaprez Опубликованный ответ не то, что вы ищете? если нет, не могли бы вы опубликовать пример ввода и желаемый результат?
5. Как насчет take along axis? Кроме того, разве ваш argsort не должен иметь axis=1? Или вы собираетесь сортировать столбцы, а не строки?
Ответ №1:
Если я вас правильно понял, вы хотите это:
norms = np.linalg.norm(a,axis=2) # shape(3,4)
indices = np.argsort(norms , axis=1)
np.take_along_axis(a, indices[:,:,None], axis=1)
вывод для вашего примера:
[[[0.4236548 0.64589411]
[0.60276338 0.54488318]
[0.5488135 0.71518937]
[0.43758721 0.891773 ]]
[[0.07103606 0.0871293 ]
[0.79172504 0.52889492]
[0.96366276 0.38344152]
[0.56804456 0.92559664]]
[[0.0202184 0.83261985]
[0.46147936 0.78052918]
[0.77815675 0.87001215]
[0.97861834 0.79915856]]]
Комментарии:
1. нет, выходные данные должны иметь ту же форму, что и переменная ‘a’.
2. @NinaKaprez Это та же форма.
a
Не имеет формы(3,4,2)
? Если нет, вам нужно будет уточнить лучше.3. @Eshan, виноват. Я думаю, это то, что мне нужно. Спасибо! можете ли вы уточнить, что делает indexes[::None] ?
4. @NinaKaprez. Он добавляет новое измерение в
None
индекс.None is np.newaxis
.5. @NinaKaprez Добро пожаловать. Не мог бы сказать лучше, чем комментарий безумного физика.