Julia,使用 findall 重置 3d 数组中的第三行

问题描述

我正在尝试使用 findall获取一个一维数组的哪些元素大于第二个一维数组的元素的索引,然后使用这些索引将第三个一维数组的相应值设置为0. MWE:

# create 3d array
a,b = [3;2;2],[4;3;2];
c = transpose(cat(a,b,dims = 2));
d,e = [1;2;3],[2;3;4];
f = transpose(cat(d,e,dims = 2));
g = cat(c,f,dims = 3);

g
2×3×2 Array{Int64,3}:
[:,:,1] =
 3  2  2
 4  3  2

[:,2] =
 1  2  3
 2  3  4

findall.(g[end,1] >= g[end-1,1]) 

并使用索引来重置 g[end,2] 的元素,这样我就得到了

g
2×3×2 Array{Int64,2] =
 1  2  3
 0  0  4

谢谢。 J

解决方法

下面的代码给出了您要求的答案。您只是将 . 放在错误的位置。您想逐个元素比较 > 操作,然后将 findall 应用于整个结果数组(不是逐个元素)。

julia> g[end,findall(g[end,:,1] .> g[end-1,1]),2] .= 0
2-element view(::Array{Int64,3},2,[1,2],2) with eltype Int64:
 0
 0

julia> g
2×3×2 Array{Int64,3}:
[:,1] =
 3  2  2
 4  3  2

[:,2] =
 1  2  3
 0  0  4

但是,我不会尝试将您的所有数据编译成一个这样的大数组。使用三个单独的一维数组变量比在一个变量中使用三个维度更容易。再次使用上面的变量:

julia> e[b .> a] .= 0
2-element view(::Array{Int64,1},2]) with eltype Int64:
 0
 0

julia> e
3-element Array{Int64,1}:
 0
 0
 4