返回1元素数组作为元素类型

时间:2020-04-17 07:35:49

标签: julia

如果我创建整数Vector

a = Vector(1:3)

我索引了一个元素,它具有元素的类型

typeof(a[3])
Int64

但是如果我使用范围对象索引一个元素,则其类型为Array

typeof(a[3:3])
Vector{Int64}

如何确保只有一个元素,则返回该元素而不是数组。原因是我想将索引的Vector发送给函数,并根据类型调用不同的方法。

2 个答案:

答案 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,则会出现此错误。

相关问题