Документы 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]])