Преобразование трехмерного ndarray в два измерения - PullRequest
0 голосов
/ 10 октября 2018

У меня есть трехмерный массив (форма 2,2,3), который можно рассматривать как комбинацию двух двумерных массивов.Я хотел бы получить эти два массива и поместить их рядом.Вот моя отправная точка:

test1 = np.ndarray((2,2,3))
test1[0] = np.array([[1,2,3],
                     [4,5,6]])
test1[1] = np.array([[7,8,9],
                     [10,11,12]])

Я могу достичь желаемого результата, перебирая первое измерение, likeo:

output = np.ndarray((2,6))
for n_port, port in enumerate(test1):
    output[:,n_port*3:(n_port+1)*3] = port  

, что дает:

array([[ 1.,  2.,  3.,  7.,  8.,  9.],
       [ 4.,  5.,  6., 10., 11., 12.]])

Но мне интересно, есть ли более приятный способ сделать это?Функция изменения формы была бы очевидным способом, но она выравнивает их, а не складывает их рядом:

test1.reshape((2,6))
array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [ 7.,  8.,  9., 10., 11., 12.]])

Любая помощь, с благодарностью полученная!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Основываясь на идее возврата, описанной в потоке: Интуиция и идея преобразования 4D массива в 2D массив в numpy , вы можете использовать комбинацию arr.transpose и arr.reshape как в:

In [162]: dd = np.arange(1, 13).reshape(2, 2, 3)

In [163]: dd
Out[163]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

In [164]: dd.transpose((1, 0, 2))
Out[164]: 
array([[[ 1,  2,  3],
        [ 7,  8,  9]],

       [[ 4,  5,  6],
        [10, 11, 12]]])

In [165]: dd.transpose((1, 0, 2)).reshape(2, -1)
Out[165]: 
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])
0 голосов
/ 10 октября 2018

Вы можете сначала сделать swapaxes(), затем reshape():

test1.swapaxes(0,1).reshape(2,6)
...