2013-01-17 63 views
6

我想用numpy數組初始化一個稀疏矩陣。所述numpy的數組包含的NaN爲零我的程序,如以下初始稀疏矩陣的代碼:用numpy.NaN初始化一個scipy.sparse矩陣的最快方法是什麼?

a= np.array([[np.NaN,np.NaN,10]]) 
zero_a= np.array([[0,0,10]]) 
spr_a = lil_matrix(a) 
zero_spr_a = lil_matrix(zero_a) 
print repr(spr_a) 
print repr(zero_spr_a) 

輸出是

 
1x3 sparse matrix of type 'type 'numpy.float64'' 
    with 3 stored elements in LInked List format 
1x3 sparse matrix of type 'type 'numpy.int64'' 
    with 1 stored elements in LInked List format 

用於與0陣列中,這裏只有1存儲在稀疏元件矩陣。但有3個元素存儲在NaN數組中,如何將NaN作爲scipy矩陣的零處理?

回答

2

0在稀疏矩陣中作爲空值的使用在代碼中深深根深蒂固,所以不幸的是它不容易改變。

首先,我會重新考慮需要將NaN或其他值作爲稀疏矩陣中的空值。您的代碼中可能還有另一種方式?

如果您確實必須更改稀疏矩陣中的空值,那麼您必須根據lil_matrix或甚至在spmatrix上定義一個新類。最重要的是,您需要更改方法get nnz(),該方法定義有多少點不爲零。但是你也需要重新定義矩陣,因爲它被轉換爲對象dtype的np.matrix,並且在這個過程中清零。

4

如果您只想從數據創建稀疏矩陣,將NaN視爲零,您可以執行以下操作。首先,讓我們在它創建一個多次np.nan個隨機排列:

>>> indices = np.nonzero(~np.isnan(a)) 
>>> sps = scipy.sparse.coo_matrix((a[indices], indices), shape=a.shape) 
>>> sps 
<5x5 sparse matrix of type '<type 'numpy.float64'>' 
    with 14 stored elements in COOrdinate format> 

,並檢查它們是相同的:

>>> nans = np.random.randint(0, 2, size=(5,5)) 
>>> a = np.ones((5,5)) 
>>> a = np.where(nans, np.nan, a) 
>>> a 
array([[ 1., 1., 1., 1., nan], 
     [ nan, nan, nan, 1., 1.], 
     [ nan, nan, 1., 1., nan], 
     [ 1., 1., 1., 1., nan], 
     [ 1., nan, 1., nan, nan]]) 

要在COO格式此稀疏,因爲它是那麼容易:

>>> sps.toarray() 
array([[ 1., 1., 1., 1., 0.], 
     [ 0., 0., 0., 1., 1.], 
     [ 0., 0., 1., 1., 0.], 
     [ 1., 1., 1., 1., 0.], 
     [ 1., 0., 1., 0., 0.]]) 

雖然你NaN s的現在不見了......

相關問題