Операции с CartesianIndex - PullRequest
       7

Операции с CartesianIndex

2 голосов
/ 29 марта 2020

Я хотел бы знать, как я могу работать с CartesianIndex. Например, у меня есть массив

julia> A = rand(1:5, 10, 2)
10×2 Array{Int64,2}:
 2 5
 1 1
 4 5
 4 1
 2 1
 4 1
 2 4
 1 5
 2 5
 4 4

, и я хочу сохранить все числа, которые остаются рядом (в паре) с номером 1. Я могу использовать c=findall(x->x==1, A), но у меня будет декартовы индексы "1" , Есть функция x=getindex.(c, [1 2]), которая создает массив, который я могу изменить, но я не знаю, как преобразовать его обратно в CartesianIndex. И я думаю, что это должен быть лучший способ сделать это.

1 Ответ

4 голосов
/ 30 марта 2020
A[view(A.==1,:,[2,1])]

Это буквально возвращает «все числа, которые остаются в паре с номером 1».

Порядок возвращаемых чисел столбчатый. Если вы хотите вернуть его по строкам:

 A'[view(A.==1,:,[2,1])']

Пример:

julia> A = rand(1:5, 10, 2)
10×2 Array{Int64,2}:
 1  4
 3  3
 1  3
 3  3
 5  1
 1  5
 2  1
 3  3
 1  3
 2  3

julia> A'[view(A.==1,:,[2,1])']
6-element Array{Int64,1}:
 4
 3
 5
 5
 2
 3

Если вы хотите получить полные строки, чем использовать filter!:

julia> filter!((x)->(1 in x), collect(eachrow(A)))
6-element Array{SubArray{Int64,1,Array{Int64,2},Tuple{Int64,Base.Slice{Base.OneTo{Int64}}},true},1}:
 [1, 4]
 [1, 3]
 [5, 1]
 [1, 5]
 [2, 1]
 [1, 3]
...