连接scipy矩阵

时间:2015-06-26 11:16:02

标签: python numpy scipy

我想连接两个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有关。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

取稀疏矩阵的均值返回NumPy矩阵(不稀疏)。 因此c0c1是矩阵:

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.]])