Python numpy вставить столбец в начале и в конце матрицы - PullRequest
1 голос
/ 02 марта 2020

Мне нужно добавить границы к моей матрице, это просто повторение первого столбца и строки в начале и последнего столбца и строки в конце матрицы.

У меня есть это Po C:

matrix = np.arange(20).reshape(4,5)

[[ 0  1  2  3  4]                                                                                                                             
 [ 5  6  7  8  9]                                                                                                                             
 [10 11 12 13 14]                                                                                                                             
 [15 16 17 18 19]]

И когда я вставляю строки сверху и снизу, как это, он отлично работает.

shape = matrix.shape (4,5)
matrix_t = np.insert(matrix, [0, shape[0]], [matrix[0], matrix[shape[0]-1]], axis=0)

[[ 0  1  2  3  4]                                                                                                                             
 [ 0  1  2  3  4]                                                                                                                             
 [ 5  6  7  8  9]                                                                                                                             
 [10 11 12 13 14]                                                                                                                             
 [15 16 17 18 19]                                                                                                                             
 [15 16 17 18 19]]

Как Вы можете видеть, что он добавил 0 1 2 3 4 в качестве первой строки и 15 16 17 18 19 в качестве последней.

Теперь я хотел сделать то же самое, просто добавив столбцы слева и справа. Немного упрощая приведенный выше код, я сделал это следующим образом (нужно было изменить форму, чтобы создать вектор-столбец).

temp1 = np.arange(4).reshape(4,1)
temp2 = np.arange(4, 8, 1).reshape(4,1)
matrix_t = np.insert(matrix, [0, 5], [temp1, temp2], axis=1)

А потом я получил эту ошибку:

Traceback (most recent call last):                                                                                                            
  File "main.py", line 33, in <module>                                                                                                        
    matrix_t = np.insert(matrix, [0, 5], [temp1, temp2], axis=1)                                                                              
  File "/usr/lib/python3/dist-packages/numpy/lib/function_base.py", line 3496, in insert                                                      
    new[slobj] = values                                                                                                                       
ValueError: total size of new array must be unchanged

Когда я это делаю вот так все работает отлично:

matrix_t = np.insert(matrix, [0, 5], temp1, axis=1)

[[ 0  0  1  2  3  4  0]                                                                                                                       
 [ 1  5  6  7  8  9  1]                                                                                                                       
 [ 2 10 11 12 13 14  2]                                                                                                                       
 [ 3 15 16 17 18 19  3]]

Чего мне не хватает?

1 Ответ

0 голосов
/ 02 марта 2020

Документы insert:

values : array_like
    Values to insert into `arr`. If the type of `values` is different
    from that of `arr`, `values` is converted to the type of `arr`.
    `values` should be shaped so that ``arr[...,obj,...] = values``
    is legal.

ваш начальный массив:

In [40]: arr = np.arange(20).reshape(4,5)  

добавление новых строк:

In [42]: np.insert(arr, [0, 4], [arr[0], arr[-1]], axis=0)                                     
Out[42]: 
array([[ 0,  1,  2,  3,  4],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [15, 16, 17, 18, 19]])

Что означает спецификация values что эти два совпадают:

In [48]: np.array([arr[0], arr[-1]])                                                           
Out[48]: 
array([[ 0,  1,  2,  3,  4],
       [15, 16, 17, 18, 19]])
In [49]: Out[42][[0,4],:]                                                                      
Out[49]: 
array([[ 0,  1,  2,  3,  4],
       [15, 16, 17, 18, 19]])

values не является list; это array_like, что означает, что insert создаст массив из этого ввода.

Когда мы попытаемся добавить новые столбцы:

In [50]: temp1 = np.arange(4).reshape(4,1) 
    ...: temp2 = np.arange(4, 8, 1).reshape(4,1) 
    ...: np.insert(arr, [0, 5], [temp1, temp2], axis=1)                                        
---------------------------------------------------------------------------
...
ValueError: shape mismatch: value array of shape (2,4,1) could not be broadcast to indexing result of shape (2,4)

Другое сообщение, но та же проблема. Посмотрите на версию массива вашего списка значений:

In [51]: np.array([temp1, temp2])                                                              
Out[51]: 
array([[[0],
        [1],
        [2],
        [3]],

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

Это массив (2,4,1). Он пытается поместить это в (2,4) слот:

In [52]: np.ones((4,7),int)[:,[0,5]]                                                           
Out[52]: 
array([[1, 1],
       [1, 1],
       [1, 1],
       [1, 1]])

Если мы соединяем временную шкалу на оси 1, чтобы создать массив (2,4), вставка работает:

In [53]: np.concatenate([temp1,temp2], axis=1)                                                 
Out[53]: 
array([[0, 4],
       [1, 5],
       [2, 6],
       [3, 7]])

In [54]: np.insert(arr, [0, 5], Out[53], axis=1)                                               
Out[54]: 
array([[ 0,  0,  1,  2,  3,  4,  4],
       [ 1,  5,  6,  7,  8,  9,  5],
       [ 2, 10, 11, 12, 13, 14,  6],
       [ 3, 15, 16, 17, 18, 19,  7]])

np.insert общего назначения, он пытается обрабатывать множество случаев, и поэтому такое понимание может быть сложным.

===

Ваша первая вставка может так же, как легко сделать с помощью индексации или объединения (vstack для более простых обозначений):

In [56]: arr[[0]+[0,1,2,3]+[3]]                                                                
Out[56]: 
array([[ 0,  1,  2,  3,  4],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [15, 16, 17, 18, 19]])
In [57]: np.vstack([arr[0],arr,arr[-1]])                                                       
Out[57]: 
array([[ 0,  1,  2,  3,  4],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [15, 16, 17, 18, 19]])

np.concatenate([arr[[0]],arr,arr[[-1]]]) такое же, где arr[[0]] имеет (1,5) форму.

И вставка столбца с конкатенацией столбцов (temp1 уже имеет форму (4,1)):

In [58]: np.concatenate([temp1, arr, temp2], axis=1)                                           
Out[58]: 
array([[ 0,  0,  1,  2,  3,  4,  4],
       [ 1,  5,  6,  7,  8,  9,  5],
       [ 2, 10, 11, 12, 13, 14,  6],
       [ 3, 15, 16, 17, 18, 19,  7]])
...