为了账号安全,请及时绑定邮箱和手机立即绑定

scipy csr_matrix:了解 indptr

scipy csr_matrix:了解 indptr

PIPIONE 2021-06-10 14:38:24
每过一段时间,我去操纵csr_matrix,但我总是忘了参数是如何indices与indptr共同打造一个稀疏矩阵。在使用符号定义稀疏矩阵时,我正在寻找关于和参数如何indptr交互的清晰直观的解释。dataindicescsr_matrix((data, indices, indptr), [shape=(M, N)])我可以从scipy 文档中看到该data参数包含所有非零数据,并且该indices参数包含与该数据关联的列(因此,indices等于col文档中给出的示例)。但是我们如何清楚地解释indptr参数呢?

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

也许这个解释可以帮助理解这个概念:

  • data 是一个包含稀疏矩阵的所有非零元素的数组。

  • indices是一个将每个元素映射data到稀疏矩阵中的列的数组。

  • indptr然后的元素映射dataindices所述稀疏矩阵的行。这是通过以下推理完成的:

    1. 如果稀疏矩阵有M行,indptr则是一个包含M+1 个元素的数组

    2. 对于第i行,[indptr[i]:indptr[i+1]]返回要取自第idataindices对应于第i行的元素的索引。所以假设indptr[i]=kindptr[i+1]=l,对应于行i的数据将data[k:l]在列indices[k:l]。这是棘手的部分,我希望下面的例子有助于理解它。

编辑:我用data字母替换了数字以避免在以下示例中混淆。

//img1.sycdn.imooc.com//60c9ab440001eae009540643.jpg

注意: 中的值indptr必然会增加,因为indptr(下一行)中的下一个单元格指的是该行中dataindices对应于该行的下一个值。


查看完整回答
反对 回复 2021-06-16
?
慕沐林林

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)


查看完整回答
反对 回复 2021-06-16
?
森栏

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'。

  • 希望你明白这一点。


查看完整回答
反对 回复 2021-06-16

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号