Сортировка трехмерного массива по одной строке / столбцу в Python - с использованием векторизации - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть трехмерный массив arr = (x, y, z) в форме numpy. Shape = (10000, 99, 2) в этом примере.

Т.е. у нас есть 10000 экземпляров двухмерных массивов 99 x 2.

Я бы хотел отсортировать весь массив по значениям в индекс z, т.е. ранжирование в соответствии с 99 переменными по строкам в каждом столбце, по каждому экземпляру.

Есть ли простой способ сделать это с помощью векторизации? Я знаю, что мог бы сделать oop более 10000 итераций, отсортировав 2-мерный массив, как показано ниже, и объединив его в 3D-вывод. и сортировка всех 10000 значений более эффективным способом.

1 Ответ

1 голос
/ 16 апреля 2020

Я не уверен, что я полностью понимаю z-оценку, но вы можете попробовать:

np.sort(arr,axis=1)

Пример 3-го ввода:

import numpy as np
rng_seed = 42  # control reproducibility
rng = np.random.RandomState(rng_seed)
arr=rng.randint(0,40,20).reshape(2,5,2)

Вход выглядит так:

[[[38 28]
  [14  7]
  [20 38]
  [18 22]
  [10 10]]

 [[23 35]
  [39 23]
  [ 2 21]
  [ 1 23]
  [29 37]]]

Применение:

arr1=np.sort(arr,axis=1)
print (arr1)

Предоставляет отсортированный массив на основе столбцов в каждом экземпляре:

[[[10  7]
  [14 10]
  [18 22]
  [20 28]
  [38 38]]

 [[ 1 21]
  [ 2 23]
  [23 23]
  [29 35]
  [39 37]]]

Если вы хотите вместо каждого ранга указать значение , попробуйте:

arr_rank = arr.argsort(axis=1)
print (arr_rank)

Вывод:

[[[4 1]
  [1 4]
  [3 3]
  [2 0]
  [0 2]]

 [[3 2]
  [2 1]
  [0 3]
  [4 0]
  [1 4]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...