2014-02-16 2 views
1

Точечный продукт строки и столбца в матрице равен 1x1 csr_matrix. Как я могу эффективно преобразовать это в скаляр? Сейчас я использую sum. M ниже квадратная матрица:Преобразование 1 × 1 разреженной матрицы в скалярный

dot_product_result = csr_matrix.sum(M.getrow(3).dot(M.getcol(5))) 

Here's the lil_matrix documentation.

UPDATE Когда я пытаюсь решение ниже, я получаю эту ошибку:

raise NotImplementedError('adding a nonzero scalar to a ' 
NotImplementedError: adding a nonzero scalar to a sparse matrix is not supported 

Это фактический код, я использую :

e = rating - Q.getrow(mid).dot(P.getcol(uid))[0] 
iteration_error += e 

Я инициализирую iteration_error до 0.0.

ответ

2

M[3,:].dot(M[:,5])[0,0]

Кроме того, вызов csr_matrix.sum, как это не очень хороший стиль: это метод экземпляра, поэтому следует назвать M[3,:].dot(M[:,5]).sum()

+0

я преобразовал 'Q.getrow (середина)' в 'Q [середина ,:] ', как вы сказали. теперь я получаю это предупреждение: «SparseEfficiencyWarning: индексирование в lil_matrix с несколькими индексами происходит медленно. Предварительная конвертация в CSC или CSR заранее эффективна. Должен ли я использовать 'getrow' вместо этого? –

+0

Вы должны измерить, какой из них быстрее. –

+0

Yowza, getrow примерно в 20 раз быстрее индексации! Вот тест, который я написал: http://lpaste.net/100041 –

Смежные вопросы