3 回答

TA贡献1844条经验 获得超8个赞
也许这个解释可以帮助理解这个概念:
data
是一个包含稀疏矩阵的所有非零元素的数组。indices
是一个将每个元素映射data
到稀疏矩阵中的列的数组。indptr
然后的元素映射data
和indices
所述稀疏矩阵的行。这是通过以下推理完成的:如果稀疏矩阵有M行,
indptr
则是一个包含M+1 个元素的数组对于第i行,
[indptr[i]:indptr[i+1]]
返回要取自第i行data
并indices
对应于第i行的元素的索引。所以假设indptr[i]=k
和indptr[i+1]=l
,对应于行i的数据将data[k:l]
在列indices[k:l]
。这是棘手的部分,我希望下面的例子有助于理解它。
编辑:我用data
字母替换了数字以避免在以下示例中混淆。
注意: 中的值indptr
必然会增加,因为indptr
(下一行)中的下一个单元格指的是该行中data
并indices
对应于该行的下一个值。

TA贡献2016条经验 获得超9个赞
当然,indptr 中的元素是按升序排列的。但是如何解释 indptr 行为呢?简而言之,直到 indptr 中的元素相同或不增加,您可以跳过稀疏矩阵的行索引。
下面的例子说明了上面对 indptr 元素的解释:
示例 1) 想象一下这个矩阵:
array([[0, 1, 0],
[8, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 7]])
mat1 = csr_matrix(([1,8,7], [1,0,2], [0,1,2,2,2,3]), shape=(5,3))
mat1.indptr
# array([0, 1, 2, 2, 2, 3], dtype=int32)
mat1.todense() # to get the corresponding sparse matrix
例2)数组转CSR_matrix(稀疏矩阵已经存在的情况):
arr = np.array([[0, 0, 0],
[8, 0, 0],
[0, 5, 4],
[0, 0, 0],
[0, 0, 7]])
mat2 = csr_matrix(arr))
mat2.indptr
# array([0, 0, 1, 3, 3, 4], dtype=int32)
mat2.indices
# array([0, 1, 2, 2], dtype=int32)
mat.data
# array([8, 5, 4, 7], dtype=int32)

TA贡献1810条经验 获得超5个赞
indptr = np.array([0, 2, 3, 6])
indices = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
[0, 0, 3],
[4, 5, 6]])
在上面来自 scipy 文档的示例中。
数据数组包含按行遍历的稀疏矩阵中存在的非零元素。
索引数组给出了每个非零数据点的列号。
例如:-col[0] 表示数据中的第一个元素,即 1,col[2] 表示数据中的第二个元素,即 2,依此类推,直到最后一个数据元素,因此数据数组和索引数组的大小相同.
indptr 数组基本上指示行的第一个元素的位置。它的大小比行数多一。
例如:- indptr 的第一个元素是 0 表示存在于 data[0] 的 row[0] 的第一个元素,即“1”,indptr 的第二个元素是 2,表示存在 row[1] 中的第一个元素在 data[2] 处,即元素 '3',indptr 的第三个元素是 3,表示 row[2] 的第一个元素在 data[3] 处,即 '4'。
希望你明白这一点。
添加回答
举报