Как отсортировать каждую строку 3D-массива numpy по другому 2D-массиву?

#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 Добро пожаловать. Не мог бы сказать лучше, чем комментарий безумного физика.