如果我创建整数Vector
a = Vector(1:3)
我索引了一个元素,它具有元素的类型
typeof(a[3])
Int64
但是如果我使用范围对象索引一个元素,则其类型为Array
typeof(a[3:3])
Vector{Int64}
如何确保只有一个元素,则返回该元素而不是数组。原因是我想将索引的Vector发送给函数,并根据类型调用不同的方法。
答案 0 :(得分:3)
这就是问题,当您致电a[3]
时
您实际上是在呼叫getindex(a, 3)
签名为getindex(::AbstractArray, ::Integer)
。
您的第二个示例通过getindex(::AbstractArray, ::UnitRange)
分派给其他函数。这两个函数的行为不同-尽管它们都给出了我期望看到的结果。
相反,python列表和numpy数组具有完全相同的行为,但是对于numpy而言,它更容易工作,因为numpy不会强制执行相同数量的广播维度。
第一个想法:使用length
a = # ...
return length(a) == 1 ? func(a[1]) : func(a)
请注意,如果您至少使用的是Julia 1.3,则可以使用only(a)
代替a[1]
。
第二个想法:如果您以编程方式索引到vector,则可以检查两个索引是否相等
i = # ... the first index
j = # ... the second index
return i == j ? func(a[i]) : func(a[i:j])
答案 1 :(得分:2)
我不确定我是否正确理解了您的问题,但是您可能正在寻找eltype
吗?
julia> eltype(a[3])
Int64
julia> eltype(a[3:3])
Int64
编辑:阅读@Miles Lucas的答案我对您的问题有不同的解释。在这种情况下,only
函数可能会有所帮助:
julia> only(a[3])
3
julia> only(a[3:3])
3
请注意,如果索引范围大于1,则会出现此错误。