2017-04-26 109 views
2

我有coo_matrixa形狀(40106, 2048)和列numpy陣列b形狀(40106,)如何連接coo_matrix與列numpy陣列

我想要做的是簡單地連接矩陣和數組(即結果數據結構將具有形狀(40106, 2049))。 我試着使用hstack如下圖所示

concat = hstack([a, b]) 

,但我得到了以下錯誤:

File "/Users/usr/anaconda/lib/python3.5/site-packages/scipy/sparse/construct.py", line 464, in hstack 
    return bmat([blocks], format=format, dtype=dtype) 
File "/Users/usr/anaconda/lib/python3.5/site-packages/scipy/sparse/construct.py", line 581, in bmat 
    'row dimensions' % i) 
ValueError: blocks[0,:] has incompatible row dimensions 

我不太明白爲什麼尺寸不匹配,因爲這兩個ab有相同的行數。

+1

我認爲這是'sparse.hstack'。當轉換爲矩陣時,你的'b'將是(1,40106)。在將它傳遞給'hstack'之前,嘗試將它轉換爲正確的稀疏矩陣。 'hstack'將作業傳遞給'bmat',最後加入所有輸入矩陣的'coo'屬性,從而創建一個新的矩陣。 – hpaulj

回答

1

我認爲這是sparse.hstack。轉換爲矩陣時,您的b將爲(1,40106)。嘗試將它轉換爲正確的稀疏矩陣,然後傳遞給hstackhstack傳遞作業bmat,從而結束了加入所有的輸入矩陣的coo屬性,從而使一個新的矩陣

In [66]: from scipy import sparse 
In [67]: A = sparse.coo_matrix(np.eye(3)) 
In [68]: b = np.ones(3) 
In [69]: sparse.hstack((A,b)) 
.... 
ValueError: blocks[0,:] has incompatible row dimensions 
In [70]: B=sparse.coo_matrix(b) 
In [71]: B 
Out[71]: 
<1x3 sparse matrix of type '<class 'numpy.float64'>' 
    with 3 stored elements in COOrdinate format> 
In [72]: sparse.hstack((A,B.T)) 
Out[72]: 
<3x4 sparse matrix of type '<class 'numpy.float64'>' 
    with 6 stored elements in COOrdinate format> 
In [73]: _.A 
Out[73]: 
array([[ 1., 0., 0., 1.], 
     [ 0., 1., 0., 1.], 
     [ 0., 0., 1., 1.]]) 

這也適用(如Divakar的答案):

In [74]: sparse.hstack((A,b[:,None])) 
Out[74]: 
<3x4 sparse matrix of type '<class 'numpy.float64'>' 
    with 6 stored elements in COOrdinate format> 

hastack作用:

return bmat([blocks], format=format, dtype=dtype) 

所以直接調用BMAT也適用

In [93]: sparse.bmat([[A, B.T]]) 
Out[93]: 
<3x4 sparse matrix of type '<class 'numpy.float64'>' 
    with 6 stored elements in COOrdinate format> 

sparse.bmat([A, B.T])產生你的blocks must be 2d錯誤。

+0

兩種方法我得到一個'ValueError:塊必須是2-D'錯誤。 –

+0

如果我使用'sparse.hstack([[A,B.T]])'',我會得到那個錯誤。 'sparse.bmat([[A,B.T]])'也適用。我使用0.18.1 scipy。 'hstack'如何將其輸入轉換爲'bmat's'可能存在版本錯誤。 – hpaulj

+0

我也使用0.18.1 scipy。現在''sparse.bmat([[A,BT]])給出了TypeError:不支持類型轉換:(dtype('float64'),dtype('

1

轉換的第二陣列,這是1D2D和使用,然後hstack -

hstack([A,B[:,None]]) 

採樣運行 -

In [86]: from scipy.sparse import coo_matrix, hstack 

# Sample inputs as a coo_matrix and an array 
In [87]: A = coo_matrix([[1, 2, 0], [3, 0, 4]]) 
    ...: B = np.array([5, 6]) 
    ...: 

# Use proposed solution 
In [88]: out = hstack([A,B[:,None]]) 

# Print the dense version to visually verify 
In [89]: out.toarray() 
Out[89]: 
array([[1, 2, 0, 5], 
     [3, 0, 4, 6]]) 
+0

現在numpy數組的形狀是'(40106,1)',但我得到以下錯誤:'ValueError:塊必須是2-D' –

+0

@ Old-school您是否在使用'from'from scipy.sparse導入hstack'? – Divakar

+0

是的,我正在使用'從'scipy.sparse導入hstack''hstack' –