Функция как перечислять, чтобы получить индекс и значение для массивов смещения? - PullRequest
8 голосов
/ 31 января 2020

Если у меня есть такой массив:

using OffsetArrays

a = OffsetArray(collect(1:5),(11:15))

Я могу перебрать массив с помощью:

for (i,x) in enumerate(a)
    println((i,x))
end

и получить:

(1, 1)
(2, 2)
(3, 3)
(4, 4)
(5, 5)

Но Я хочу это:

(11, 1)
(12, 2)
(13, 3)
(14, 4)
(15, 5)

Есть ли способ получить реальный индекс, так как я использую массив смещения?

1 Ответ

9 голосов
/ 31 января 2020

Функция pairs учитывает поведение индексации:

julia> using OffsetArrays

julia> a = OffsetArray(collect(1:5),(11:15))

julia> for (i,x) in pairs(a)
         println((i,x))
       end

(11, 1)
(12, 2)
(13, 3)
(14, 4)
(15, 5)

из документов:

Base.pairs - Функция .

pairs(collection)

Возвращает итератор для пар key => value для любой коллекции, которая сопоставляет набор ключей с набором значений. Сюда входят массивы, где ключами являются индексы массива.

pairs(IndexLinear(), A)
pairs(IndexCartesian(), A)
pairs(IndexStyle(A), A)

Итератор, который обращается к каждому элементу массива A, возвращая i => x, где i - индекс для элемента и x = A[i]. Идентичен pairs(A), за исключением того, что стиль индекса может быть выбран. Также похоже на enumerate(A), за исключением того, что i будет действительным индексом для A, тогда как enumerate всегда отсчитывает от 1 независимо от индексов A.

Указание IndexLinear() гарантирует, что i будет целым числом; указание IndexCartesian() гарантирует, что i будет CartesianIndex; указание IndexStyle(A) выбирает тот, который был определен как собственный стиль индексации для массива A.

Мутация границ базового массива сделает этот итератор недействительным.

...