Numpy Python - вставка матрицы в список индексов матрицы numpy - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь вставить несколько столбцов с несколькими индексами Numpy Matrix.

Пока у меня есть код ниже:

MatrixA = np.zeros(shape=(200,300))
MatrixB = np.ones(shape=(200,1))
index_list = [1,3,5]
Output = np.insert(MatrixA, index_list, MatrixB, axis=1)

И он возвращает аналогичный результат к тому, что я ищу:

array([[0., 1., 0., 1., ..., 0., 0., 0.],
       [0., 1., 0., 1., ..., 0., 0., 0.],
       [0., 1., 0., 1., ..., 0., 0., 0.],
       ...,
       [0., 1., 0., 1., ..., 0., 0., 0.],
       [0., 1., 0., 1., ..., 0., 0., 0.],
       [0., 1., 0., 1., ..., 0., 0., 0.]])

Однако, это только для одного столбца. Когда я пытаюсь добавить в несколько столбцов:

MatrixA = np.zeros(shape=(200,300))
MatrixB = np.ones(shape=(200,2))
index_list = [1,3,5]
Output = np.insert(MatrixA, index_list, MatrixB, axis=1)

я получаю ошибку:

ValueError: несоответствие формы: массив значений формы (200,2) не может быть передан для индексации результата формы (3200)

Мой желаемый результат будет выглядеть примерно так:

array([[0., 1., 1., 0., 1., 1., ..., 0., 0., 0.],
       [0., 1., 1., 0., 1., 1., ..., 0., 0., 0.],
       [0., 1., 1., 0., 1., 1., ..., 0., 0., 0.],
       ...,
       [0., 1., 1., 0., 1., 1., ..., 0., 0., 0.],
       [0., 1., 1., 0., 1., 1., ..., 0., 0., 0.],
       [0., 1., 1., 0., 1., 1., ..., 0., 0., 0.]])

Кто-нибудь знает, как это сделать, и почему я получаю ошибку выше ?

Ответы [ 2 ]

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

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) делает это дублирование.

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

Вы можете вставить 2d массив, но вам нужно использовать slice объект. Мне не удалось передать сразу несколько секций в np.insert, поэтому, если это не слишком вычислительно, вы можете сделать для l oop, а именно:

slices = [slice(i, i+MatrixB.shape[1]) for i in index_list]

for s in slices:
     MatrixA[:,s] = MatrixB

Заметьте, что это не эквивалентно np.insert, поскольку оно не добавит измерение к MatrixA. После вычисления MatrixA.shape по-прежнему (200,300).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...