什么是 Julia 中的“colptr”及其在 Python 中的对应物?

S.K*_*.Ky 1 python python-3.x julia

我正在尝试将一些 Julia 代码重写为 python 代码。我刚刚发现colptr附加到稀疏矩阵。我搜索了它,但我仍然不明白它是什么。有人可以向我提供有关它的信息以及 python 3 中的对应信息吗?先感谢您。

[编辑] 这是来自Julia 的参考资料

struct SparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrix{Tv,Ti}
m::Int                  # Number of rows
n::Int                  # Number of columns
colptr::Vector{Ti}      # Column j is in colptr[j]:(colptr[j+1]-1)
rowval::Vector{Ti}      # Row indices of stored values
nzval::Vector{Tv}       # Stored values, typically nonzeros
Run Code Online (Sandbox Code Playgroud)

例如,A.colptr[j]是否引用 CSC 矩阵第 j 列的所有元素A

我试图通过运行下面的一些简单代码来弄清楚,

A = sparse([1, 1, 2, 3], [1, 3, 2, 3], [0, 1, 2, 0])

for i=1:4
    println(A.colptr[i])
end
Run Code Online (Sandbox Code Playgroud)

结果是

1 2 3 5

我仍然不知道为什么结果会是这样。解释说

Ti 是用于存储列指针的整数类型

Mat*_* B. 5

您正在查看矩阵的压缩稀疏列 (CSC) 表示。例如,不是将矩阵的所有值按顺序存储在内存中,而是只允许存储非零值。例如,矩阵

5  0  0
6  0  7
1  0  3
0  2  0
Run Code Online (Sandbox Code Playgroud)

无论是存储在内存中的列主要序列5 6 1 0 0 0 0 2 0 7 3 0 或者你可以做一些更聪明。

如果你只存储非零元素的列主序列,你最终会得到一个更短的列表:5 6 1 2 7 3!但是现在您需要一种方法将这些值映射回它们在矩阵中的位置。您需要一个索引和一个索引。因此,我们还有两个列表:

对于每个存储的值的行指数,也可以存储在一对一的方式:1 2 3 4 2 3

现在,我可以以类似的一对一方式存储列索引:1 1 1 2 3 3. 如果我这样做,这将是一种稀疏坐标 (COO) 格式。但请注意,这里有很多冗余信息:看看所有这些重复的值!通用 CSC 格式进一步压缩了这一点。我已经知道我有三列;我可以简单地存储,其中每列开始。这是colptr:它每列有一个值和到该列的开始位置。因此,不是存储六个值,它只需要存储三个:第一列从索引 1 开始(当然)。第二列从索引 4 开始,第三列从索引 5 开始。如果我们还存储表示最后一个的最后第四个值,结果会更容易一些,因为这样我们就可以描述特定列中的非零值简单地说,列中存储的值j可以在nzval[colptr[j]:colptr[j+1]-1].

典型的Python当量是在SciPy的:scipy.sparse.csc_matrix; 只需替换colptr-> indptr, indices-> rowval, nzval->data并适应基于 0 的索引。