Сципи дает неверный результат для умножения матриц - PullRequest
0 голосов
/ 19 октября 2018

Я использую 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)

Method3

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)

enter image description here

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

1 Ответ

0 голосов
/ 19 октября 2018

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

(P1**4).todense()

Результат:

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

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

- так как Zinki упоминается в их комментарии :

p.power(2) is"поэлементная власть".9**4 = 6561.

...