Повторная сортировка массива 3D-Numpy - PullRequest
0 голосов
/ 01 ноября 2018

Я получил 3d-массив

>>> a
array([[[[9, 6, 1],
         [2, 8, 6],
         [3, 5, 6]],

        [[9, 1, 9],
         [6, 6, 7],
         [3, 0, 7]],

        [[9, 2, 7],
         [6, 1, 4],
         [9, 2, 2]],

        [[3, 7, 0],
         [4, 0, 6],
         [7, 4, 8]]]]) 

Теперь я хочу изменить этот массив, чтобы определенные значения были сгруппированы, т.е.

 >>> a[0,:,0,0]
 array([9, 9, 9, 3])

Итак, я хочу, чтобы первый элемент каждого блока находился в одном массиве, второй элемент каждого блока в другом массиве и т. Д.

То, что я сделал до сих пор, изменило его следующим образом:

>>> b = a[0,:,:,:].T
>>> b
array([[[9, 9, 9, 3],
        [2, 6, 6, 4],
        [3, 3, 9, 7]],

       [[6, 1, 2, 7],
        [8, 6, 1, 0],
        [5, 0, 2, 4]],

       [[1, 9, 7, 0],
        [6, 7, 4, 6],
        [6, 7, 2, 8]]])

Таким образом, массивы уже созданы, но сортировка неверна. Таким образом, матрицы 2x4 строятся по строкам. Я хочу, чтобы он был построен по столбцам, то есть в этом случае следующие шесть строк должны быть следующими:

>>> b[:,0,:]
array([[9, 9, 9, 3],
       [6, 1, 2, 7],
       [1, 9, 7, 0]])

>>> b[:,1,:]
array([[2, 6, 6, 4],
       [8, 6, 1, 0],
       [6, 7, 4, 6]])

Я возился с тем, как индексировать, что мой массив построен правильно. Интуитивно понятный подход к проблеме заключается в том, что матрицы 3х3 расположены друг за другом, и я хочу вырезать массивы 1х4, идущие в направлении z (так в кучу), и поместить их в один массив по строкам.

Я имею в виду, что я мог бы перебирать их с помощью цикла for, но я бы предпочел векторизовать все это путем индексации и нарезки. Любая помощь приветствуется! Спасибо

np.concatenate([b[:,i,:] for i in range(3)])

1 Ответ

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

numpy.transpose(..) - это функция, которая может переставлять оси в любом порядке.

Если я правильно понял, вы в основном хотите, чтобы третья и четвертая оси были первой и второй осью новой матрицы, а старая первая и вторая матрицы - новой третьей и четвертой осью.

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

>>> a.transpose((2,3,0,1))
array([[[[9, 9, 9, 3]],
        [[6, 1, 2, 7]],
        [[1, 9, 7, 0]]],

       [[[2, 6, 6, 4]],
        [[8, 6, 1, 0]],
        [[6, 7, 4, 6]]],

       [[[3, 3, 9, 7]],
        [[5, 0, 2, 4]],
        [[6, 7, 2, 8]]]])

Поскольку здесь вы построили массив 4d, но первый индекс имеет только один элемент, может быть лучше просто удалить этот индекс, например с помощью:

>>> a[0,:,:,:].transpose(1,2,0)
array([[[9, 9, 9, 3],
        [6, 1, 2, 7],
        [1, 9, 7, 0]],

       [[2, 6, 6, 4],
        [8, 6, 1, 0],
        [6, 7, 4, 6]],

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