首页 > 解决方案 > CartesianIndex 操作

问题描述

我想知道如何使用 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。我认为这一定是一个更好的方法来做到这一点。

标签: julia

解决方案


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]

推荐阅读