np.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.
Ваш MatrixA
равен (200 300); индексирование по оси 1 с помощью [1,3,5]
MatrixA[:,[1,3,5]]
имеет форму (200,3). (Я не совсем уверен, почему в сообщении об ошибке указано indexing result of shape (3,200)
.)
Давайте проиллюстрируем это меньшими массивами:
In [328]: MatrixA = np.zeros(shape=(2,10))
In [329]: MatrixB = np.ones(shape=(2,2))
In [330]: index_list = [1,3,5]
In [331]: Output = np.insert(MatrixA, index_list, 1, axis=1)
In [332]: Output.shape
Out[332]: (2, 13)
In [333]: Output
Out[333]:
array([[0., 1., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 0.]])
In [334]: Output[:,[1,4,7]]
Out[334]:
array([[1., 1., 1.],
[1., 1., 1.]])
insert
, по сути, открыл MatrixA
после столбцов 1,3,5 и вставил значение заполнения. Открываемое пространство определяется index_list
, , а не размером значения заполнения. Это не вставка заливки в каждый столбец, а попытка вставить ее во все пространство заливки:
In [337]: Output = np.insert(MatrixA, index_list, np.arange(1,7).reshape(2,3), axis=1)
In [338]: Output
Out[338]:
array([[0., 1., 0., 0., 2., 0., 0., 3., 0., 0., 0., 0., 0.],
[0., 4., 0., 0., 5., 0., 0., 6., 0., 0., 0., 0., 0.]])
Чтобы вставить 2 значения в каждый слот, нам нужно продублировать индексы:
In [339]: Output = np.insert(MatrixA, [1,1,3,3,5,5], 2, axis=1)
In [340]: Output.shape
Out[340]: (2, 16)
In [341]: Output
Out[341]:
array([[0., 2., 2., 0., 0., 2., 2., 0., 0., 2., 2., 0., 0., 0., 0., 0.],
[0., 2., 2., 0., 0., 2., 2., 0., 0., 2., 2., 0., 0., 0., 0., 0.]])
np.repeat(index_list,2)
делает это дублирование.