Примечание для будущих гуглов, код OP имеет следующий импортированный пакет:
> import numpy as np
> import scipy.sparse as sp
В любом случае, давайте начнем с нашего объяснения.
Вы можете проверить размер матрицы, используя:
> np.shape(your_matrix_here) #equals to MATLAB: > size(your_matrix_here)
Когда вы вызываете todense (), вы получаете:
matrix([[ 1000.], #shape: (1, 100)
[ 1000.],
[ 1000.],
...
, а [:, 1] выглядит так:
array([ 0., 0., ... , 0., 0.]) #shape: (100,)
ИтакВы можете захотеть транспонировать матрицу с помощью transpose ().
Но транспонирование матрицы возвращает матрицу, содержащую матрицу:
matrix([[ 1000., 1000., ... , 1000., 1000.]]) #shape: (1, 100)
и по какой-то причине d.dot(b).todense().transpose()[0]
не возвращаетсяпервый элемент матрицы:
matrix([[ 1000., 1000., ... , 1000., 1000.]]) #still the same!
Это можно исправить с помощью:
> np.array(d.dot(b).todense().transpose())[0]
, таким образом возвращая:
array([ 1000., 1000., ... 1000., 1000.])
Теперь дваиз них получили одинаковую форму, что позволило им выполнять матричные операции:
> np.shape(np.array(d.dot(b).todense().transpose())[0]) #(100,)
> np.shape(a[:,1]) #(100,)
В заключение вы хотите изменить эту строку:
a[:,k] += d.dot(b).todense()
до:
a[:,k] += np.array(d.dot(b).todense().transpose())[0]