8

我想用 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)

输出是

'type'numpy.float64'' 类型的 1x3 稀疏矩阵
    具有 3 个以链接列表格式存储的元素
'type'numpy.int64'' 类型的 1x3 稀疏矩阵
    具有 1 个以链接列表格式存储的元素

对于 0 的数组,稀疏矩阵中仅存储 1 个元素。但是 NaN 数组中存储了 3 个元素,对于 scipy 矩阵,如何将 NaN 视为零?

4

2 回答 2

6

如果您只想从数据中创建一个稀疏矩阵,将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]])

为了使这种稀疏的 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>

并检查它们是否相同:

>>> 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 现在不见了...

于 2013-01-17T18:22:31.063 回答
2

零作为稀疏矩阵中的空值的用法在代码中根深蒂固,所以不幸的是它不是很容易改变。

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

如果您真的必须更改稀疏矩阵中的空值,那么您将不得不基于lil_matrix甚至基于spmatrix. 最重要的是你需要改变方法get nnz(),它定义了有多少点是非零的。但是您还需要重新定义矩阵,因为它被转换为np.matrixobject dtype,并且在此过程中清除了零。

于 2013-01-17T17:35:55.193 回答