是否有类似 coo_matrix 的东西但对于稀疏向量?
is there something like coo_matrix but for sparse vectors?
我试图从一系列有一些重叠索引的数组中创建一个稀疏向量。对于矩阵,有一个非常 convenient object in scipy 可以做到这一点:
coo_matrix((data, (i, j)), [shape=(M, N)])
因此,如果数据恰好具有重复元素(因为它们的 i、j 索引相同),则这些元素会在最终的稀疏矩阵中求和。我想知道除了稀疏向量之外是否可以做类似的事情,或者我是否只需要使用这个对象并假装它是一个 1 列矩阵?
虽然您可以重现一维等效矩阵,但仅使用 1 行(或 1 列)稀疏矩阵会节省大量工作。我不知道 numpy
.
有任何稀疏向量包
coo
格式完全按照您给定的方式存储输入数组,没有求和。在显示或(否则)转换为 csc
或 csr
格式时完成求和。由于编译了 csr
构造函数,因此它将比您在 Python.
中编写的任何代码更快地求和
构建“一维”稀疏 coo 矩阵
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])
查看数组表示(形状(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,)
一维数组。
我试图从一系列有一些重叠索引的数组中创建一个稀疏向量。对于矩阵,有一个非常 convenient object in scipy 可以做到这一点:
coo_matrix((data, (i, j)), [shape=(M, N)])
因此,如果数据恰好具有重复元素(因为它们的 i、j 索引相同),则这些元素会在最终的稀疏矩阵中求和。我想知道除了稀疏向量之外是否可以做类似的事情,或者我是否只需要使用这个对象并假装它是一个 1 列矩阵?
虽然您可以重现一维等效矩阵,但仅使用 1 行(或 1 列)稀疏矩阵会节省大量工作。我不知道 numpy
.
coo
格式完全按照您给定的方式存储输入数组,没有求和。在显示或(否则)转换为 csc
或 csr
格式时完成求和。由于编译了 csr
构造函数,因此它将比您在 Python.
构建“一维”稀疏 coo 矩阵
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])
查看数组表示(形状(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,)
一维数组。