gpt4 book ai didi

arrays - 数组范围补码

转载 作者:行者123 更新时间:2023-12-04 13:57:20 25 4
gpt4 key购买 nike

有没有办法覆盖[]在数组中有范围的补码?

julia> a=[1:8...]
8-element Array{Int64,1}:
1
2
3
4
5
6
7
8

julia> a[-1] == a[2:8]
julia> a[-(1:3)] == a[4:8]
julia> a[-end] == a[1:7]

最佳答案

我之前没有研究过索引的内部结构,但乍一看,以下内容可能不会破坏太多:

immutable Not{T}
idx::T
end

if :to_indices in names(Base)
# 0.6
import Base: to_indices, uncolon, tail, _maybetail

@inline to_indices(A, inds, I::Tuple{Not, Vararg{Any}}) =
(setdiff(uncolon(inds, (:, tail(I)...)), I[1].idx), to_indices(A, _maybetail(inds), tail(I))...)
else
# 0.5
import Base: getindex, _getindex

not_index(a::AbstractArray, I, i::Int) = I
not_index(a::AbstractArray, I::Not, i::Int) = setdiff(indices(a, i), I.idx)

getindex(a::AbstractArray, I::Not) = getindex(a, setdiff(linearindices(a), I.idx))
_getindex(::Base.LinearIndexing, a::AbstractArray, I::Vararg{Union{Real, AbstractArray, Colon, Not}}) =
Base._getindex(Base.linearindexing(a), a, (not_index(a, idx, i) for (i,idx) in enumerate(I))...)
end

例如:

julia> a = reshape(1:9, (3, 3))
3×3 Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}}:
1 4 7
2 5 8
3 6 9

julia> a[Not(2:8)]
2-element Array{Int64,1}:
1
9

julia> a[Not(1:2), :]
1×3 Array{Int64,2}:
3 6 9


julia> a[Not(end), end]
2-element Array{Int64,1}:
7
8

我不关心性能,也没有进行广泛的测试,所以事情当然可以改进。

编辑:

我用评论中链接的他的 github 评论中的 Matt B. 版本替换了 0.6 的代码。

由于他对 0.6 的数组索引实现的出色设计,只需要扩展一个函数即可获得 getindex 的补数索引。 , setindexview ,例如,

julia> view(a, Not(2:8))
2-element SubArray{Int64,1,UnitRange{Int64},Tuple{Array{Int64,1}},false}:
1
9

# collect because ranges are immutable
julia> b = collect(a); b[Not(2), Not(2)] = 10; b
3×3 Array{Int64,2}:
10 4 10
2 5 8
10 6 10

关于arrays - 数组范围补码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com