2016-11-22 156 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>