Как изменить размер массива формы (N, N) на (N, N, 3)

#arrays #numpy #multidimensional-array #reshape #numpy-ndarray

#массивы #numpy #многомерный массив #изменить #numpy-ndarray

Вопрос:

У меня есть массив формы (2084, 2084), я хочу изменить его на (2084, 2084, 3). Я пытался использовать np.dstack, но это дает мне что-то вроде этого (1, 2084, 2084)

 patch = (2084, 2084)
patch_new = np.dstack(patch)
  

Как мне это сделать?

Комментарии:

1. dstack обрабатывает ваш массив как список массивов (он, как и все concatenate производные, ожидает список). А затем присоединяет их к новому измерению 3d (глубины). Таким образом, он не только добавил начальную единицу, но и транспонировал другие размеры.

Ответ №1:

Вы пропустили перевод вашего массива в 3D перед укладкой в глубину. Итак, вы можете использовать что-то вроде:

 In [93]: patch = (2084, 2084)

In [94]: arr = np.random.random_sample(patch)

# make it as 3D array
In [95]: arr = arr[..., np.newaxis]

# and then stack it along the third dimension (say `n` times; here `3`)
In [96]: arr_3d = np.dstack([arr]*3)

In [97]: arr_3d.shape
Out[97]: (2084, 2084, 3)
  

Другой способ сделать то же самое (т. Е. Если вы не хотите явно переводить свой входной массив в 3D):

 In [140]: arr_3d = np.dstack([arr]*3)
In [141]: arr_3d.shape
Out[141]: (2084, 2084, 3)

# sanity check
In [146]: arr_3 = np.dstack([arr[..., np.newaxis]]*3)

In [147]: arr_3.shape
Out[147]: (2084, 2084, 3)

In [148]: np.allclose(arr_3, arr_3d)
Out[148]: True
  

Комментарии:

1. Поскольку вы добавили завершающую новую ось, вы могли бы вырезать посредника и делать np.concatenate([arr]*3], axis=2) напрямую.

2. @hpaulj Я получаю, AxisError: axis 2 is out of bounds for array of dimension 2 когда я попробовал ваше предложение. Кажется, мы не можем устранить посредника.

3. Кому-то все еще нужно добавить newaxis . Все, что dstack делает extra, применяется np.atleast_3d к каждому аргументу. Код довольно короткий.

Ответ №2:

 In [730]: x = np.arange(8).reshape(2,4)                                         
In [731]: x                                                                     
Out[731]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
  

Ваш dstack не только добавляет начальное измерение, но и транспонирует остальные. Это потому, что он обрабатывает ваш массив как список, np.dstack([x[0,:], x[1,:]]) .

 In [732]: np.dstack(x)                                                          
Out[732]: 
array([[[0, 4],
        [1, 5],
        [2, 6],
        [3, 7]]])
  

Это repeat задача

 In [733]: np.repeat(x[...,None],3,axis=2)                                       
Out[733]: 
array([[[0, 0, 0],
        [1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]],

       [[4, 4, 4],
        [5, 5, 5],
        [6, 6, 6],
        [7, 7, 7]]])
  

Ответ №3:

Кмарио, то есть вы повторяете один и тот же массив 3 раза в третьем измерении?