Фактический ответ на этот вопрос меня удивил.То, что вы спрашиваете, можно перефразировать как:
почему dropdims(a)
не удаляет все измерения синглтона?
Я собираюсь процитировать Тима Холи из соответствующая проблема здесь:
squeeze (A) не может возвращать тип, который компилятор может определить - размеры входной матрицы являются переменной времени выполнения, поэтомуу компилятора нет возможности узнать, сколько измерений будет иметь выход.Так что это не может дать вам стабильность типов, которую вы ищете.
Помимо стабильности типов, есть и другие удивительные последствия того, что вы написали.Например, обратите внимание, что:
julia> f(a) = dropdims(a, dims = tuple(findall(size(a) .== 1)...))
f (generic function with 1 method)
julia> f(rand(1,1,1))
0-dimensional Array{Float64,0}:
0.9939103383167442
В итоге, включение такого метода в Base
Джулия побудит пользователей использовать его, что приведет к потенциально нестабильному типу кода, который при некоторых обстоятельствах не будетбыстро (чего-то, что разработчики ядра усиленно пытаются избежать).В таких языках, как Python, строгая стабильность типов не применяется, и поэтому вы найдете такие функции.
Конечно, ничто не мешает вам определить свой собственный метод, как у вас.И я не думаю, что вы найдете значительно более простой способ написать это.Например, предложение для Base
, которое не было реализовано, было методом:
function squeeze(A::AbstractArray)
singleton_dims = tuple((d for d in 1:ndims(A) if size(A, d) == 1)...)
return squeeze(A, singleton_dims)
end
Просто помните о возможных последствиях его использования.