2016-11-22 7 views
2

У меня есть две разреженные матрицы (созданные из sklearnHashVectorizer, из двух наборов функций - каждый набор соответствует признаку). Я хочу объединить их, чтобы потом использовать их для кластеризации. Но я столкнулся с проблемой с размерами, так как две матрицы не имеют одинаковых размеров строк.Укладка двух разреженных матриц с различными размерами

Вот пример:

Xa = [-0.57735027 -0.57735027 0.57735027 -0.57735027 -0.57735027 0.57735027 
    0.5   0.5  -0.5   0.5   0.5  -0.5   0.5 
    0.5  -0.5   0.5  -0.5   0.5   0.5  -0.5 
    0.5   0.5  ] 

Xb = [-0.57735027 -0.57735027 0.57735027 -0.57735027 0.57735027 0.57735027 
-0.5   0.5   0.5   0.5  -0.5  -0.5   0.5 
-0.5  -0.5  -0.5   0.5   0.5  ] 

Оба Xa и Xb имеют тип <class 'scipy.sparse.csr.csr_matrix'>. Формы Xa.shape = (6, 1048576) Xb.shape = (5, 1048576). Ошибки я получаю (что теперь я знаю, почему это происходит):

X = hstack((Xa, Xb)) 
    File "/usr/local/lib/python2.7/site-packages/scipy/sparse/construct.py", line 464, in hstack 
    return bmat([blocks], format=format, dtype=dtype) 
    File "/usr/local/lib/python2.7/site-packages/scipy/sparse/construct.py", line 581, in bmat 
    'row dimensions' % i) 
ValueError: blocks[0,:] has incompatible row dimensions 

Есть ли способ, чтобы стек разреженных матриц, несмотря на нерегулярные размеры? Может быть, с некоторым дополнением?

Я смотрел на эти посты:

+0

Вы можете разместить форму ваших матриц Xa и Xb? –

+0

обновленный пост с фигурами. – user1717931

+0

Я думаю, что нашел обход: конкатенацию с использованием ухабистого и преобразование результата в csr_matrix. Изучая больше, чтобы узнать, все ли в порядке. Xc = np.concatenate ([Xa.data, Xb.data]), а затем выполните: sm = sparse.csr_matrix (Xc). – user1717931

ответ

3

Вы можете заполнить его пустой решеткой.

Вы хотите горизонтально укладывают так, что вам нужно раздуть меньшую матрицу так, что она имеет одинаковое число строк как большей матрицы. Для этого вы вертикально складываете с матрицей формы (difference in number of rows, number of columns of original matrix).

Как это:

from scipy.sparse import csr_matrix 
from scipy.sparse import hstack 
from scipy.sparse import vstack 

# Create 2 empty sparse matrix for demo 
Xa = csr_matrix((4, 4)) 
Xb = csr_matrix((3, 5)) 


diff_n_rows = Xa.shape[0] - Xb.shape[0] 

Xb_new = vstack((Xb, csr_matrix((diff_n_rows, Xb.shape[1])))) 
#where diff_n_rows is the difference of the number of rows between Xa and Xb 

X = hstack((Xa, Xb_new)) 
X 

Какие результаты в:

<4x9 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in COOrdinate format> 

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

  • Нет связанных вопросов^_^