有没有像coo_matrix这样的稀疏向量?

时间:2015-04-10 15:56:16

标签: python numpy scipy sparse-matrix sparse-array

我试图从一系列有重叠索引的数组中创建一个稀疏向量。对于矩阵,有一个非常convenient object in scipy就是这样:

coo_matrix((data, (i, j)), [shape=(M, N)])

因此,如果数据恰好具有重复元素(因为它们的i,j索引相同),那么这些元素在最终的稀疏矩阵中求和。我想知道是否有可能做类似的事情,但对于稀疏矢量,或者我只是使用这个对象并假装它是一个1列矩阵?

1 个答案:

答案 0 :(得分:1)

虽然您可能能够重现1d等效值,但只需使用1行(或1列)稀疏矩阵就可以节省大量工作。我不知道numpy的任何稀疏矢量包。

coo格式完全按照您的方式存储输入数组,而不进行求和。在显示或(以其他方式)转换为csccsr格式时完成求和。而且由于编译了csr构造函数,因此它的汇总速度比你在Python中编写代码的速度快。

构造'1d'稀疏变换矩阵

In [67]: data=[10,11,12,14,15,16]    
In [68]: col=[1,2,1,5,7,5]
In [70]: M=sparse.coo_matrix((data (np.zeros(len(col)),col)),shape=(1,10))

查看其数据表示(无求和)

In [71]: M.data
Out[71]: array([10, 11, 12, 14, 15, 16])
In [72]: M.row
Out[72]: array([0, 0, 0, 0, 0, 0])
In [73]: M.col
Out[73]: array([1, 2, 1, 5, 7, 5])

查看数组表示(shape (1,10)

In [74]: M.A
Out[74]: array([[ 0, 22, 11,  0,  0, 30,  0, 15,  0,  0]])

和csr等价物。

In [75]: M1=M.tocsr()
In [76]: M1.data
Out[76]: array([22, 11, 30, 15])
In [77]: M1.indices
Out[77]: array([1, 2, 5, 7])
In [78]: M1.indptr
Out[78]: array([0, 4])

In [79]: np.nonzero(M.A)
Out[79]: (array([0, 0, 0, 0]), array([1, 2, 5, 7]))

nonzero显示相同的模式:

In [80]: M.nonzero()
Out[80]: (array([0, 0, 0, 0, 0, 0]), array([1, 2, 1, 5, 7, 5]))

In [81]: M.tocsr().nonzero()
Out[81]: (array([0, 0, 0, 0]), array([1, 2, 5, 7]))

In [82]: np.nonzero(M.A)
Out[82]: (array([0, 0, 0, 0]), array([1, 2, 5, 7]))

M.toarray().flatten()将为您提供(10,) 1d数组。

相关问题