Как преобразовать одноэлементный массив в скалярный?

Допустим у меня есть Array переменной называется p:

julia> p = [5]
julia> typeof(p)
Array{Int64,1}

как преобразовать его в скалярный? p также может быть 2-мерное:

julia> p = [1]'' 
julia> typeof(p)
Array{Int64,2}

(Примечание: двойной транспонировать трюк, чтобы увеличить dimentionality может не работать в будущих версиях Julia)

через соответствующие манипуляции, я могу сделать p любого измерения, но как я должен уменьшить его до скаляра?


один жизнеспособный подход p=p[1], но это не приведет к ошибке, если p имеет более одного элемента в p; так что мне это не подходит. Я мог бы создать свою собственную функцию (с проверкой),

function scalar(x)
    assert(length(x) == 1)
    x[1]
end

но похоже, что это должно быть изобретение колеса.

что не работает squeeze, который просто слезает размеры до p представляет собой нуль-мерный массив.

(относительно Julia: преобразование массива 1x1 из внутреннего продукта в число но, в данном случае, операция-агностическая.)

1 ответов


Если вы хотите получить скаляр, но бросить ошибку, если массив неправильной формы, вы могли бы 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