`findall` 来自 Julia 中的笛卡尔索引向量

问题描述 投票:0回答:1

CI
是给定的向量。每个元素都是
CartesianIndex

julia> CI
5-element Vector{CartesianIndex{3}}:                                     
 CartesianIndex(1, 3, 1)                                                
 CartesianIndex(1, 1, 4)                                                 
 CartesianIndex(2, 2, 3)                                                 
 CartesianIndex(1, 2, 4)                                                 
 CartesianIndex(1, 1, 1)  

我想在 CI 中查找第

d
个元素为
k
的元素。让
f(CI,d,k)
成为这样一个函数。

julia> f(CI,1,2)
[CartesianIndex(2, 2, 3) ]

julia> f(CI,2,1)
[CartesianIndex(1, 1, 4), CartesianIndex(1, 1, 1)]

如何定义这样的函数

f
? 我想一个简单的方法是将
CI
转换为矩阵数组,然后使用
findall
函数。但我觉得还有更聪明的方法。

arrays julia
1个回答
0
投票

Julia 有很多方法可以完成这个任务。以下是一些例子:

findall

函数
的一个方法将任意一元函数作为其第一个参数,该函数传递给相关集合的每个元素,如果它返回true
,则被视为匹配。 
CartesianIndex
 值可以像 
Tuple
s
一样进行索引,因此可以使用它来查找
CI
 的哪些元素在维度 
value
 中具有 
d
 值:

julia> CI = [CartesianIndex(1,3,1), CartesianIndex(1,1,4), CartesianIndex(2,2,3), CartesianIndex(1,2,4), CartesianIndex(1,1,1)] 5-element Vector{CartesianIndex{3}}: CartesianIndex(1, 3, 1) CartesianIndex(1, 1, 4) CartesianIndex(2, 2, 3) CartesianIndex(1, 2, 4) CartesianIndex(1, 1, 1) julia> CI[2] CartesianIndex(1, 3, 1) julia> CI[2][1] 1 julia> findall(idx -> idx[2] == 1, CI) 2-element Vector{Int64}: 2 5 julia> f(ci, d, value) = ci[findall(idx -> idx[d] == value, ci)] f (generic function with 1 method) julia> f(CI, 1, 2) 1-element Vector{CartesianIndex{3}}: CartesianIndex(2, 2, 3) julia> f(CI, 2, 1) 2-element Vector{CartesianIndex{3}}: CartesianIndex(1, 1, 4) CartesianIndex(1, 1, 1)
您还可以

广播getindex

方法和==
运算符并使用向量的
逻辑索引达到相同的效果:

julia> getindex(CI[1], 2) 3 julia> getindex.(CI, 2) 5-element Vector{Int64}: 3 1 2 2 1 julia> getindex.(CI, 2) .== 1 5-element BitVector: 0 1 0 0 1 julia> f2(ci, d, value) = ci[getindex.(ci, Ref(d)) .== value] f2 (generic function with 1 method) julia> f2(CI, 1, 2) 1-element Vector{CartesianIndex{3}}: CartesianIndex(2, 2, 3) julia> f2(CI, 2, 1) 2-element Vector{CartesianIndex{3}}: CartesianIndex(1, 1, 4) CartesianIndex(1, 1, 1)
    
© www.soinside.com 2019 - 2024. All rights reserved.