2013-01-17 60 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的现在不见了......

相关问题