Как указать порядок во время np.reshape - PullRequest
0 голосов
/ 04 мая 2019

У меня есть numpy ndarray формы (t, n, h, w, c).Я хочу частично сплющить его, чтобы получить ndarray формы (t*n, h, w, c).Тем не менее, я хочу иметь возможность указать порядок, в котором это происходит. В частности, я хочу, чтобы это было в 'n -основном порядке'.

Допустим, у меня есть массив A с A.shape = (128, 16, 160, 210, 3и массив B с B.shape = (16, 128, 160, 210, 3).Они почти одинаковы, за исключением того, что первые два измерения поменялись местами.

Уплощение B следующим образом группирует данные так, как мне хотелось бы:

B = B.reshape(-1, *B.shape[2:])

B.shape = (2048, 160, 210, 3)

Уплощение A даетмассив той же формы, но с данными в другом порядке.

Я пробовал следующее: A = np.moveaxis(A, 0, 1) A = A.reshape(-1, *A.shape[2:])

Я могу отчасти заставить его работать A = np.asarray([A[:, i, ...] for i in range(n)]) где n - длина второго измерения, но я чувствую, что есть более тупой способ сделать это.

Я думаю, потому что moveaxisswapaxis) создает view (то есть предполагается для изменения порядка обхода), что порядок по умолчанию для выравнивания основан на исходном порядке данных.

Как можно сгладить A таким образом, чтобыЯ хотел бы?

1 Ответ

0 голосов
/ 04 мая 2019

Вы можете использовать X.reshape(t*n, h, w, c, order='F')

Например.

>>> x = np.array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

>>> x.shape
(2, 3, 4) 

>>> x.reshape(2*3, 4, order='C')
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23]])

>>> x.reshape(2*3, 4, order='F')
array([[ 0,  1,  2,  3],
       [12, 13, 14, 15],
       [ 4,  5,  6,  7],
       [16, 17, 18, 19],
       [ 8,  9, 10, 11],
       [20, 21, 22, 23]])

...