Реорганизация трехмерного массива - PullRequest
0 голосов
/ 22 ноября 2018

Я пробовал и искал несколько дней, я подошел ближе, но мне нужна ваша помощь.

У меня есть 3d-массив в python,

shape(files)
>> (31,2049,2)

, что соответствует31 входной файл с 2 столбцами данных с 2048 строками и заголовком.

Я бы хотел отсортировать этот массив на основе заголовка, который является числом, в каждом файле.

Iпытался следовать NumPy: сортировка трехмерного массива, но сохранение 2-го измерения, присвоенного первому , но я невероятно запутался.

Сначала я пытаюсь настроить получение заголовков для argsort, я думал, чтомог бы сделать

sortval=files[:][0][0]

но это не работает ..

Затем я просто сделал цикл for для итерации и получил мои заголовки

for i in xrange(shape(files)[0]:
    sortval.append([i][0][0])

Затем

sortedIdx = np.argsort(sortval)

Это работает, однако я не понимаю, что происходит в последней строке ..

files = files[np.arange(len(deck))[:,np.newaxis],sortedIdx]

Помощь будет принята.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Еще один способ сделать это с np.take

header = a[:,0,0]
sorted = np.take(a, np.argsort(header), axis=0)
0 голосов
/ 22 ноября 2018

Здесь мы можем использовать простой пример, чтобы продемонстрировать, что делает ваш код:

Сначала мы создаем случайную трехмерную матрицу с 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]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...