2016-11-22 113 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  ] 

两个XaXb<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

您可以用空的稀疏矩阵填充它。

你想horizo​​ntaly堆,所以你需要垫更小的矩阵,使其具有相同的行数为更大的矩阵的。为此你垂直堆栈它与形状(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>