Scipy дает неправильный результат для умножения матриц

Я использую scipy для матричного умножения разреженной матрицы. По какой-то причине метод .power() не работает для разреженной матрицы. Я проверил это тремя способами:

Вот мой код:

import scipy as sp
import scipy.sparse 

Метод 1. Умножение простой матрицы

row = np.array([0, 3, 1, 0])
col = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
P1 = sp.sparse.coo_matrix((data, (row, col)), shape=(4, 4))
#Method 1
P1.power(4).todense() #gives wrong result

Результат:

matrix([[ 256,    0, 6561,    0],  #6561 isn't right
        [   0, 2401,    0,    0],
        [   0,    0,    0,    0],
        [   0,    0,    0,  625]], dtype=int32)

Метод 2:

P = P1.copy()
#calculate ^4
for loop in range(2):
    P = P.dot(P)
P.todense()

Вывод

matrix([[ 256,    0,  576,    0],
        [   0, 2401,    0,    0],
        [   0,    0,    0,    0],
        [   0,    0,    0,  625]], dtype=int32)

Метод 3

P1.dot(P1).dot(P1).dot(P1).todense()

Вывод:

matrix([[ 256,    0,  576,    0],
        [   0, 2401,    0,    0],
        [   0,    0,    0,    0],
        [   0,    0,    0,  625]], dtype=int32)

Метод 4:

Результат можно проверить по адресу этот сайт (symbolab.com)

введите здесь описание изображения

Другие темы по этой теме (Поэлементная мощь scipy.sparse matrix, Мощность матрицы для разреженной матрицы в python), сосредоточьтесь на < em> как выполнить матричное умножение. Буду признателен за любую помощь.


person watchtower    schedule 19.10.2018    source источник
comment
p.power(2) - это поэлементная мощность. 9**4 = 6561. Об этом также говорится в первой связанной вами теме (даже в заголовке).   -  person Zinki    schedule 19.10.2018
comment
Спасибо, Зинки. Если бы вы могли добавить ответ, я могу его принять.   -  person watchtower    schedule 19.10.2018


Ответы (1)


Вы можете использовать ** обозначение:

(P1**4).todense()

Результат:

[[ 256    0  576    0]
 [   0 2401    0    0]
 [   0    0    0    0]
 [   0    0    0  625]]

РЕДАКТИРОВАТЬ: Относительно того, почему .power() не возвращает ожидаемый результат:

- как указано в Zinki в их комментарий:

p.power(2) - это «поэлементная сила». 9**4 = 6561.

person l'L'l    schedule 19.10.2018
comment
Спасибо, я. С уважением, вопрос не в том, чтобы how произвести умножение, а в том, почему я получаю неправильный ответ. Я считаю, что существует 50 тысяч способов умножения. - person watchtower; 19.10.2018
comment
Пожалуйста! Комментарий Зинки более или менее резюмирует, почему вы не получаете правильный результат. - person l'L'l; 19.10.2018
comment
О, спасибо ... Только что видел это ... Замечательно. Если вы можете отредактировать свой ответ, я его приму. - person watchtower; 19.10.2018