2013-08-08 2 views
4

У меня есть CSR matrix:точка рутина для scipy.sparse матриц производит ошибки

>> print type(tfidf) 
<class 'scipy.sparse.csr.csr_matrix'> 

Я хочу взять скалярное произведение двух строк этой CSR matrix:

>> v1 = tfidf.getrow(1) 
>> v2 = tfidf.getrow(2) 
>> print type(v1) 
<class 'scipy.sparse.csr.csr_matrix'> 

Оба v1 и v2 также CSR-матрицы. Поэтому я использую dot подпрограмму:

>> print v1.dot(v2) 

Traceback (most recent call last): 
    File "cosine.py", line 10, in <module> 
    print v1.dot(v2) 
    File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 211, in dot 
    return self * other 
    File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 246, in __mul__ 
    raise ValueError('dimension mismatch') 
ValueError: dimension mismatch 

Они являются ряды одной и той же матрицы, так что их габариты должны соответствовать:

>> print v1.shape 
(1, 4507) 
>> print v2.shape 
(1, 4507) 

Почему dot подпрограмма не работает?

Спасибо.

+0

Каковы размеры ваших двух матриц? Разве они не совпадают? – Justin

+0

@ Justin: Размеры должны быть одинаковыми. Это строки той же матрицы. – abhinavkulkarni

+0

Вы не можете сделать '1xn' пунктиром с' 1xn', он должен быть '1xn' пунктиром с' nx1'. Как насчет 'v1.dot (v2.transpose())'. – Justin

ответ

6

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

import scipy as sp 

a = sp.matrix([1, 2, 3]) 
b = sp.matrix([4, 5, 6]) 

In [13]: a.dot(b.transpose()) 
Out[13]: matrix([[32]]) 

Versus

In [14]: a.transpose().dot(b) 
Out[14]: 
matrix([[ 4, 5, 6], 
     [ 8, 10, 12], 
     [12, 15, 18]]) 
Смежные вопросы