Вернуть 1-элементный массив как тип элемента - PullRequest
1 голос
/ 17 апреля 2020

Если я создаю Vector целых чисел

a = Vector(1:3)

и индексирую один элемент, он имеет тип элемента

typeof(a[3])
Int64

, но если я индексирую один элемент с Объект диапазона имеет тип Array

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

Как я могу убедиться, что в случае только одного элемента, возвращается элемент, а не массив. Причина в том, что я хочу отправить индексированный вектор в функцию, и в зависимости от типа вызывается другой метод.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Почему это происходит?

Так вот в чем проблема, когда вы звоните 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)

Обратите внимание, что вы можете использовать only(a) вместо a[1], если вы хотя бы на Julia 1.3.

Вторая идея: если вы программно индексируете вектор, вы можете проверить, равны ли эти два индекса

i = # ... the first index
j = # ... the second index
return i == j ? func(a[i]) : func(a[i:j])
2 голосов
/ 17 апреля 2020

Я не уверен, что правильно понял ваш вопрос, но вы, возможно, ищете eltype?

julia> eltype(a[3])
Int64

julia> eltype(a[3:3])
Int64

РЕДАКТИРОВАТЬ: Читая ответ @Miles Лукаса, я вижу другую интерпретацию вашего вопроса. В этом случае может быть полезна функция only:

julia> only(a[3])
3

julia> only(a[3:3])
3

Обратите внимание, что это ошибки при индексации с диапазоном, превышающим 1.

...