Здесь мы можем использовать простой пример, чтобы продемонстрировать, что делает ваш код:
Сначала мы создаем случайную трехмерную матрицу с numy:
a = (np.random.rand(3,3,2)*10).astype(int)
array([[[3, 1],
[3, 7],
[0, 3]],
[[2, 9],
[1, 0],
[9, 2]],
[[9, 2],
[8, 8],
[8, 0]]])
Затем a[:]
даст a
сама по себе, а a[:][0][0]
- это только первая строка в первом двумерном массиве в a
, которая:
a[:][0]
# array([[3, 1],
# [3, 7],
# [0, 3]])
a[:][0][0]
# array([3, 1])
В данном примере вам нужен заголовок, равный 3,2,9
, поэтому мыможно использовать a[:, 0, 0]
для их извлечения:
a[:,0,0]
# array([3, 2, 9])
Теперь мы сортируем вышеприведенный список и получаем индексный массив:
np.argsort(a[:,0,0])
# array([1, 0, 2])
Чтобы переставить весь трехмерный массив, нам нужнонарезать массив в правильном порядке.И np.arange(len(a))[:,np.newaxis]
равно np.arange(len(a)).reshape(-1,1)
, что создает последовательный массив двумерных индексов:
np.arange(len(a))[:,np.newaxis]
# array([[0],
# [1],
# [2]])
Без двумерного массива мы будем разделять массив на 2 измерения
a[np.arange(3), np.argsort(a[:,0,0])]
# array([[3, 7],
# [2, 9],
# [8, 0]])
С2D массив, мы можем выполнить 3D нарезку и сохранить форму:
a[np.arange(3).reshape(-1,1), np.argsort(a[:,0,0])]
array([[[3, 7],
[3, 1],
[0, 3]],
[[1, 0],
[2, 9],
[9, 2]],
[[8, 8],
[9, 2],
[8, 0]]])
И выше конечный результат, который вы хотите.
Редактировать:
Чтобы расположить 2Dмассивы :, можно использовать:
a[np.argsort(a[:,0,0])]
array([[[2, 9],
[1, 0],
[9, 2]],
[[3, 1],
[3, 7],
[0, 3]],
[[9, 2],
[8, 8],
[8, 0]]])