gpt4 book ai didi

iteration - 如何迭代除 AbstractArray 的最后一个索引之外的所有索引

转载 作者:行者123 更新时间:2023-12-04 18:02:19 26 4
gpt4 key购买 nike

在 Julia 中,推荐的方法是迭代 AbstractArray 的所有索引是使用 eachindex ,例如,

for i in eachindex(a)
do_something(a[i], i)
end

对比 1:length(a) , eachindex(a)支持具有非常规索引的数组,即索引不是从 1 开始的.此外,对于线性索引较慢的数组,它更有效。

如果我想跳过第一个索引,我可以使用 Iterators.drop(eachindex(a), 1) (有更好的方法吗?)但是我如何以通用方式跳过最后一个?

最佳答案

“前端”迭代器相对简单且通常很有用。 编辑 :仅针对这种情况就完全通用地定义它也是完全矫枉过正的。依赖具有如下定义的 Base 内置函数要容易得多:

front(itr, n=1) = Iterators.take(itr, length(itr)-n)

这将适用于所有带有 length 的迭代器定义 - 将包括 eachindex 的所有内容将返回。

或者,您可以根据不依赖于 length 的基本原理定义专门的迭代器。被定义。我不知道任何现有包中有这样的结构。使用 Julia 0.6,实现可能如下所示:
struct Front{T}
itr::T
end
# Basic iterator definition
function Base.start(f::Front)
s = start(f.itr)
done(f.itr, s) && throw(ArgumentError("cannot take the front of an empty iterator"))
return next(f.itr, s)
end
function Base.next(f::Front, state)
val, s = state
return val, next(f.itr, s)
end
Base.done(f::Front, state) = done(f.itr, state[2])

# Inherit traits as appropriate
Base.iteratorsize(::Type{Front{T}}) where {T} = _dropshape(Base.iteratorsize(T))
_dropshape(x) = x
_dropshape(::Base.HasShape) = Base.HasLength()
Base.iteratoreltype(::Type{Front{T}}) where {T} = Base.iteratoreltype(T)
Base.length(f::Front) = length(f.itr) - 1
Base.eltype(f::Front{T}) where {T} = eltype(T)

现在:
julia> collect(Front(eachindex(rand(5))))
4-element Array{Int64,1}:
1
2
3
4

julia> collect(Front(eachindex(sprand(3, 2, .2))))
5-element Array{CartesianIndex{2},1}:
CartesianIndex{2}((1, 1))
CartesianIndex{2}((2, 1))
CartesianIndex{2}((3, 1))
CartesianIndex{2}((1, 2))
CartesianIndex{2}((2, 2))

关于iteration - 如何迭代除 AbstractArray 的最后一个索引之外的所有索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43641012/

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