使用numpy.NaN初始化scipy.sparse矩阵的最快方法是什么?

use*_*717 7 python scipy

我想初始化一个带有numpy数组的稀疏矩阵.numpy数组包含我的程序的NaN为零,初始化稀疏矩阵的代码如下:

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)
Run Code Online (Sandbox Code Playgroud)

输出是

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个元素存储在稀疏矩阵中.但是NaN数组中存储了3个元素,如何将NaN视为零作为scipy矩阵?

Jai*_*ime 5

如果您要做的只是根据数据创建一个稀疏矩阵,将NaNs视为零,则可以执行以下操作。首先,创建一个包含多个np.nans 的随机数组:

>>> 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]])
Run Code Online (Sandbox Code Playgroud)

为了使这种稀疏的COO格式,它很容易:

>>> 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>
Run Code Online (Sandbox Code Playgroud)

并检查它们是否相同:

>>> 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.]])
Run Code Online (Sandbox Code Playgroud)

虽然你NaN的现在不见了...


tia*_*ago 2

在稀疏矩阵中使用零作为空值在代码中根深蒂固,因此不幸的是它并不容易改变。

首先,我会重新考虑是否需要将NaN或其他值视为稀疏矩阵中的空值。也许您的代码中有另一种方法?

如果您确实必须更改稀疏矩阵中的空值,那么您必须基于lil_matrix甚至基于 定义一个新类spmatrix。最重要的是,您需要更改方法get nnz(),该方法定义了有多少点非零。但您还需要重新定义矩阵,因为它被强制转换为np.matrix对象数据类型,并且在此过程中清除了零。