我很难理解为什么会发生这种行为。
我有一个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接受的答案所隐含的内容)?我如何访问这些值?
答案 0 :(得分:2)
对于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)
或者,您可以将数组转换为&#34; COO&#34; (坐标)格式。然后,您可以访问row
和col
属性:
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)