2015-06-26 3 views
0

Я хочу объединить две csr_matrix, каждая с shape=(1,N).конкатенирующие scipy матрицы

Я знаю, что я должен использовать scipy.sparse.vstack:

from scipy.sparse import csr_matrix,vstack 
c1 = csr_matrix([[1, 2]]) 

c2 = csr_matrix([[3, 4]]) 

print c1.shape,c2.shape 
print vstack([c1, c2], format='csr') 

#prints: 
(1, 2) (1, 2) 
    (0, 0) 1 
    (0, 1) 2 
    (1, 0) 3 
    (1, 1) 4 

Однако мой код не:

from scipy.sparse import csr_matrix,vstack 
import numpy as np 
y_train = np.array([1, 0, 1, 0, 1, 0]) 
X_train = csr_matrix([[1, 1], [-1, 1], [1, 0], [-1, 0], [1, -1], [-1, -1]]) 

c0 = X_train[y_train == 0].mean(axis=0) 
c1 = X_train[y_train == 1].mean(axis=0) 

print c0.shape, c1.shape #prints (1L, 2L) (1L, 2L) 
print c0,c1 #prints [[-1. 0.]] [[ 1. 0.]] 
print vstack([c0,c1], format='csr') 

Последняя строка вызывает исключение -

File "C:\Anaconda\lib\site-packages\scipy\sparse\construct.py", line 484, in vstack
return bmat([[b] for b in blocks], format=format, dtype=dtype)

File "C:\Anaconda\lib\site-packages\scipy\sparse\construct.py", line 533, in bmat
raise ValueError('blocks must be 2-D') ValueError: blocks must be 2-D

Я думаю, с помощью mean есть что-то делать без. Любые идеи?

+1

'prints [[-1. 0.]] [[1. 0.]] '- это не то, как печатаются разреженные матрицы. Это плотные. – hpaulj

+0

@hpaulj Да, это было немного странно ... Я заметил, что в конце концов – omerbp

+1

'mean' и' sum' выполняются 'dot' умножением с плотным массивом (из них) - и результат представляет собой плотную матрицу. Даже если в строке есть только одно ненулевое значение, эта сумма строк будет отличной от нуля. – hpaulj

ответ

1

Принимая среднее значение разреженной матрицы, возвращает матрицу NumPy (которая не является разреженной). Так c0 и c1 матрица:

In [76]: type(c0) 
Out[76]: numpy.matrixlib.defmatrix.matrix 

In [89]: sparse.issparse(c0) 
Out[94]: False 

vstack ожидает, что ее первый аргумент последовательности разреженных матриц. Итак, сделайте (по крайней мере) первую матрицу разреженной матрицей:

In [31]: vstack([coo_matrix(c0), c1]) 
Out[31]: 
<2x2 sparse matrix of type '<type 'numpy.float64'>' 
    with 2 stored elements in COOrdinate format> 

In [32]: vstack([coo_matrix(c0), c1]).todense() 
Out[32]: 
matrix([[-1., 0.], 
     [ 1., 0.]]) 
+0

Или используйте 'np.vstack'. – hpaulj

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