Вставить элемент и изменить размер массива

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Я хочу добавить размеры в массив, но expand_dims всегда добавляет размерность размера 1.

Ввод:

 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  

Что делает expand_dims:

 [[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]]
  

Чего я хочу:

 [[[1, 1], [1, 2], [1, 3]], [[1, 4], [1, 5], [1, 6]], [[1, 7], [1, 8], [1, 9]]]
  

По сути, я хочу заменить каждый скаляр в матрице вектором [1, x] , где x — исходный скаляр.

Ответ №1:

Вот один из способов использования широковещательной передачи и np.insert() функции:

 In [32]: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
In [33]: np.insert(a[:,:,None], 0, 1, 2)                                                                                                                                                                    
Out[33]: 
array([[[1, 1],
        [1, 2],
        [1, 3]],

       [[1, 4],
        [1, 5],
        [1, 6]],

       [[1, 7],
        [1, 8],
        [1, 9]]])
  

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

1. Я понял это, используя expand_dims , который должен быть эквивалентен a[:,:,None] , но в конце концов не нуждался в дополнительном измерении. Я все перепутал: np.insert(a, 0, 1, axis=1) это все, что мне было нужно. Тем не менее, это все еще правильный ответ на мой вопрос. Спасибо

Ответ №2:

Существует множество способов построения нового массива.

Вы можете создать массив с правильной формой и заливкой и скопировать значения:

 In [402]: arr = np.arange(1,10).reshape(3,3)
In [403]: arr
Out[403]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
In [404]: res = np.ones((3,3,2),int)
In [405]: res[:,:,1] = arr
In [406]: res
Out[406]: 
array([[[1, 1],
        [1, 2],
        [1, 3]],

       [[1, 4],
        [1, 5],
        [1, 6]],

       [[1, 7],
        [1, 8],
        [1, 9]]])
  

Вы можете объединить массив с массивом аналогичного размера, равным 1s. concatenate является основной функцией объединения:

 In [407]: np.concatenate((np.ones((3,3,1),int), arr[:,:,None]), axis=2)
Out[407]: 
array([[[1, 1],
        [1, 2],
        [1, 3]],

       [[1, 4],
        [1, 5],
        [1, 6]],

       [[1, 7],
        [1, 8],
        [1, 9]]])
  

np.stack((np.ones((3,3),int), arr), axis=2) делает то же самое под прикрытием. np.dstack (‘d’ для глубины) также делает это. insert В другом ответе это также делается.