我应该如何将单例数组转换为标量?

时间:2015-03-20 04:23:52

标签: arrays julia scalar

假设我有一个名为Array的{​​{1}}变量:

p

我应该如何将其转换为标量? julia> p = [5] julia> typeof(p) Array{Int64,1} 也可能是二维的:

p

(注意:增加维数的双转置技巧might not work in future versions of Julia

通过适当的操作,我可以制作任何维度的julia> p = [1]'' julia> typeof(p) Array{Int64,2} ,但我应该如何将其缩小为标量?


一种可行的方法是p,但如果p=p[1]p中有多个元素,则不会产生任何错误;所以,这对我没有好处。 我可以构建自己的函数(带检查),

p

但似乎必须重新发明轮子。

什么行不通的是function scalar(x) assert(length(x) == 1) x[1] end ,它只是剥离尺寸,直到squeeze为零维数组。

(与Julia: convert 1x1 array from inner product to number相关,但在这种情况下,与操作无关。)

2 个答案:

答案 0 :(得分:8)

如果你想获得标量但是如果数组形状错误则抛出错误,你可以reshape

julia> p1 = [4]; p2 = [5]''; p0 = []; p3 = [6,7];

julia> reshape(p1, 1)[1]
4

julia> reshape(p2, 1)[1]
5

julia> reshape(p0, 1)[1]
ERROR: DimensionMismatch("new dimensions (1,) must be consistent with array size 0")
 in reshape at array.jl:122
 in reshape at abstractarray.jl:183

julia> reshape(p3, 1)[1]
ERROR: DimensionMismatch("new dimensions (1,) must be consistent with array size 2")
 in reshape at array.jl:122
 in reshape at abstractarray.jl:183

答案 1 :(得分:1)

您应该使用 only,它是在 Julia v1.4 中引入的

julia> only([])
ERROR: ArgumentError: Collection is empty, must contain exactly 1 element
Stacktrace:
  [1] only(x::Vector{Any})
    @ Base.Iterators ./iterators.jl:1323
  [...]

julia> only([1])
1

julia> only([1 for i in 1:1, j in 1:1, k in 1:1]) # multidimensional ok
1