arrays - 数组范围补码

标签 arrays julia

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

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/

相关文章:

javascript - 使用 toLowerCase 通过 for 循环在数组中查找匹配项

indexing - Julia - 如何用索引向量的向量来索引向量?

julia - 如何将条形图 x 轴上的标签从数字更改为文本?

julia - 如何在 julia 中捕获 linux 信号

c++ - 内置数组类型的开始和结束函数

c++ - 如何访问 mex 文件中 Matlab 结构数组中的数据

Julia:并行构建多种类型

Julia plotly

Python:内存中字符串的大小

arrays - 动态分配内存到数组并读取大文本文件