在某些数据结构(矩阵)中,您可能希望能够通过多个标签对矩阵进行切片,或者至少有标记的切片,而不是按索引进行切片。
例如,假设我们有一个矩阵描述公司之间的支付。列是支出(支付者),行是(收入)接受者。矩阵是正方形的,因为每个公司都是沿着两个轴上市的。对角线是零,因为一家公司不为自己付钱(理论上)。
然而,现在您想要按部门(制造业、农业)划分这个矩阵,以找到农业支付子矩阵。或者,你可能想分得更小一些,看看制造业给粮食公司带来了多少报酬。在这两种语言中,是否有一个能够以整洁和可读的方式标记切片的包?
理论切片语法
# 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中是否有任何方法可以做到这一点?
或者我需要自己写这样的东西,我认为可以用一个树状的数据结构来完成,这个结构包含了每个节点的索引范围。
发布于 2022-08-05 07:34:05
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.7167114738439391https://stackoverflow.com/questions/73222342
复制相似问题