每隔一段时间,我都会操作一个csr_matrix
,但我总是忘记参数indices
和indptr
是如何一起工作来构建稀疏矩阵的。
我希望在使用符号csr_matrix((data, indices, indptr), [shape=(M, N)])
定义稀疏矩阵时,能够清楚直观地解释indptr
如何与data
和indices
参数交互。
我可以从scipy documentation中看到,data
参数包含所有非零数据,indices
参数包含与该数据关联的列(因此,在文档中给出的示例中,indices
等于col
)。但是,我们如何清楚地解释indptr
参数呢?
6条答案
按热度按时间xeufq47z1#
也许这样的解释可以帮助理解这个概念:
data
是包含稀疏矩阵的所有非零元素的数组。indices
是将data
中的每个元素Map到其在稀疏矩阵中的列的数组。1.然后,
indptr
将data
和indices
的元素Map到稀疏矩阵的行。1.如果稀疏矩阵有M行,则
indptr
是包含M+1个元素的数组1.对于行i,
[indptr[i]:indptr[i+1]]
返回要从data
和indices
中获取的对应于行i的元素的索引。因此,假设indptr[i]=k
和indptr[i+1]=l
,对应于行i的数据将是data[k:l]
,位于列indices[k:l]
。这是比较棘手的部分,我希望下面的示例有助于理解它。EDIT:在下面的示例中,我用字母替换了
data
中的数字,以避免混淆。注意:
indptr
中的值必然会增加,因为indptr
中的下一个单元格(下一行)引用了与该行对应的data
和indices
中的下一个值。x7rlezfr2#
当然,indptr中的元素是按升序排列的,但如何解释indptr的行为呢?简而言之,直到indptr中的元素相同或不增加,您才可以跳过稀疏矩阵的行索引。
下面的示例说明了indptr元素的上述解释:
例1)设想这样的矩阵:
示例2)CSR_matrix的数组(稀疏矩阵已经存在的情况):
os8fio9y3#
在此范例中:
要读取
indptr
,请执行以下操作-indptr[0] = 0
indptr[1] = 2
表示非零数据元素的数量,直到第一行的末尾indptr[2] = 3
表示从第二行开始到结束的非零数据元素的数量。indptr[3] = 6
表示从第三行的开头到结尾的非零数据元素的数量。jq6vz3qz4#
在上面的示例中,来自scipy文档。
webghufk5#
由于这是一个稀疏矩阵,这意味着与整个元素($m \times n$)相比,矩阵中的非零元素相对非常少。
我们用途:
data
存储所有非零元素,从左到右,从上到下indices
来存储这些数据中的每一个的所有列索引indptr[i]:indptr[i+1]
表示data
字段中的切片,以查找行[i]的所有非零元素iecba09b6#
可以将indptr中的值看作是 * a在压缩前(稀疏)格式的特定行开始之前**已经传递的非零元素的数量。这很难理解,但下面的示例应该可以解释清楚。
前。
indptr[0] = 0,因为在预压缩矩阵的第一行开始之前,矩阵中的0个值已经被传递(由于我们还没有开始遍历矩阵,因此没有值被传递)
indptr[2] = 5,因为在预压缩矩阵中的第3行开始之前已经经过了矩阵中的5个值(值2、19、5、8、1)。
indptr[3] = 5,因为在预压缩矩阵中的第4行开始之前已经经过了矩阵中的5个值(因为预压缩矩阵的第4行中的所有值都是零)
indptr[4] = 8,因为在预压缩矩阵中的第5行开始之前,矩阵中的8个值已经过去(indptr阵列中的最后一个值将总是等于预压缩(稀疏)矩阵中的非零值的数目