Python或Julia中是否有阵列库可以启用标签阵列切片和子切片



在某些数据结构(矩阵(中,您可能希望能够通过多个标签对矩阵进行切片,或者至少具有标记的切片,而不是通过索引进行切片。

例如,假设我们有一个描述公司之间付款的矩阵。列是支出(支付者(,行是(收入(接受者。矩阵是正方形的,因为每个公司都是沿着两个轴列出的。对角线是零,因为一家公司(理论上(不向自己付款。

然而,现在你想按部门(制造业、农业(划分这个矩阵,以找到农业支付子矩阵。或者,你可能想缩小规模,看看制造业向粮食公司支付了多少钱。有没有一个包可以在任何一种语言中以整洁可读的方式实现标记切片?

理论切片语法

# Slicing array for agriculture
payments[payments.expenditures.agriculture, payments.incomes.agriculture]
# Slicing for manufacturing payments to agriculture->grain specifically
payments[payments.expenditures.manufacturing, payments.incomes.agriculture.grain]

在这种情况下,payments.expenditures.manufacturing大约是14:18(总共有3家制造公司(,payments.incomes.agriculture.grain大约是7:8(总共有1家公司(。但是上面的语法比payments[14:18, 7:8]更可读

理论上,你的切片中可以有n大小的层次结构。从行业到具体产品的分类。

想知道在Python或Julia中是否有任何方法可以做到这一点?

或者我必须自己写这样的东西,我认为可以使用树状数据结构来实现,该结构包含每个节点中的索引范围。

JuMP.Containers具有您所要求的功能。您可以使用自定义索引定义数组,然后对它们进行切片。

julia> using JuMP.Containers
julia> a = DenseAxisArray(rand(3,3),[:a,:b,:c],[:d,:e,:f])
2-dimensional DenseAxisArray{Float64,2,...} with index sets:
Dimension 1, [:a, :b, :c]
Dimension 2, [:d, :e, :f]
And data, a 3×3 Matrix{Float64}:
0.894139  0.797912  0.594439
0.849874  0.916928  0.716711
0.804051  0.320512  0.739498
julia> a[:b, :]
1-dimensional DenseAxisArray{Float64,1,...} with index sets:
Dimension 1, [:d, :e, :f]
And data, a 3-element Vector{Float64}:
0.849874338245389
0.9169276864574099
0.7167114738439391

最新更新