我想连接两个csr_matrix,每个都有shape=(1,N)
。
我知道我应该使用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')
最后一行引发异常 -
文件“C:\ Anaconda \ lib \ site-packages \ scipy \ sparse \ construct.py”,第484行,在vstack中 返回bmat([[b]表示块中的b],格式=格式,dtype = dtype)
文件“C:\ Anaconda \ lib \ site-packages \ scipy \ sparse \ construct.py”,第533行,在bmat中 提高ValueError('块必须是2-D') ValueError:blocks必须是2-D
我猜使用mean
与out有关。
有什么想法吗?
答案 0 :(得分: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.]])