scipy csr_matrix:了解 indptr

每过一段时间,我去操纵csr_matrix,但我总是忘了参数是如何indicesindptr共同打造一个稀疏矩阵。

在使用符号定义稀疏矩阵时,我正在寻找关于和参数如何indptr交互的清晰直观的解释。dataindicescsr_matrix((data, indices, indptr), [shape=(M, N)])

我可以从scipy 文档中看到该data参数包含所有非零数据,并且该indices参数包含与该数据关联的列(因此,indices等于col文档中给出的示例)。但是我们如何清楚地解释indptr参数呢?


PIPIONE
浏览 492回答 3
3回答

婷婷同学_

也许这个解释可以帮助理解这个概念: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对应于该行的下一个值。

慕沐林林

当然,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)

森栏

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'。希望你明白这一点。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python