【问题标题】:Why does indptr not match the values in this csr matrix?为什么 indptr 与这个 csr 矩阵中的值不匹配?
【发布时间】:2018-03-22 20:27:16
【问题描述】:

我很难理解为什么会发生这种行为。

我有一个 scipy 稀疏 csr 矩阵。前十个元素是:

print my_mat[0:10,]

  (0, 31)       1
  (0, 33)       1
  (1, 36)       1
  (1, 40)       1
  (2, 47)       1
  (2, 48)       1
  (3, 50)       1
  (3, 53)       1
  (4, 58)       1
  (4, 60)       1
  (5, 66)       1
  (5, 68)       1
  (6, 73)       1
  (6, 75)       1
  (7, 77)       1
  (7, 82)       1
  (8, 30)       1
  (8, 32)       1
  (9, 37)       1
  (9, 40)       1

当我拨打indptr 时,我得到:

m1 = my_mat[0:10,]
print m1.indptr
[ 0  2  4  6  8 10 12 14 16 18 20]

为什么indptr 的值不相等:

0 0 1 1 2 2 3 3 等(my_mat 的第一列,这是对this question 的接受答案所暗示的内容)?如何访问这些值?

【问题讨论】:

  • 2012 年的回答误导了你。 indptr 是一个特殊的csr 压缩数组,与等价的coo 格式矩阵的row 属性不同。

标签: python scipy sparse-matrix


【解决方案1】:

对于 CSR 矩阵,m1.indptr 不保存行索引。相反,对于行r,值对start, end = m1.indptr[r:r+2] 将开始和结束索引提供到m1.data 中存储在行r 中的值。也就是说,m1.data[start:end] 保存r 行中的非零值。这些值的列在m1.indices[start:end]

在您的示例中,您有m1.indptr = [ 0 2 4 6 8 10 12 14 16 18 20]。所以第一行的非零值存放在m1.data[0:2],这些值所在的列存放在m1.indices[0:2]。第二行存储的非零值是m1.data[2:4],它们的列是m1.indices[2:4]等。

如果您想要行和列索引,可能最简单的方法是使用nonzero() 方法。例如,这是一个 CSR 矩阵:

In [50]: s
Out[50]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 4 stored elements in Compressed Sparse Row format>

In [51]: s.A
Out[51]: 
array([[ 0, 10, 40,  0,  0, 20,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, 30,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0]], dtype=int64)

这里我们使用nonzero()方法来获取非零值的行和列索引:

In [71]: row, col = s.nonzero()

In [72]: row
Out[72]: array([0, 0, 0, 2], dtype=int32)

In [73]: col
Out[73]: array([1, 2, 5, 3], dtype=int32)

或者,您可以将数组转换为“COO”(坐标)格式。然后就可以访问rowcol属性:

In [52]: c = s.tocoo()

In [53]: c.row
Out[53]: array([0, 0, 0, 2], dtype=int32)

In [54]: c.col
Out[54]: array([1, 2, 5, 3], dtype=int32)

【讨论】:

  • s.nonzero() 执行 tocoo 转换,以及针对可能的零值的附加过滤器(稀疏方法并不总是 eliminate_zeros)。
猜你喜欢
  • 2013-03-24
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2022-12-13
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多