Julia:获取多维数组沿特定轴的范围(最小值/最大值)

Julia: Get range (minimum / maximum values) of a multidimensional array along specific axes

给定一些维度为 N1N2N3 的数组,Julia 中是否有任何方法可以获取此多维数组的最小值和最大值(范围)给定轴的不同级别?

例如,假设我们有一个大小为 (10, 3, 100) 的数组 my_array(意思是 N1 = 10N2 = 3N3 = 100 以与术语保持一致上面使用)。我想获得 N2 的三个不同 'levels' 的最小值和最大值。基本上,我想要一些更简洁的代码来执行以下操作:

N2_1_range = (minimum(my_array[:,1,:]), maximum(my_array[:,1,:])
N2_2_range = (minimum(my_array[:,2,:]), maximum(my_array[:,2,:])
N2_3_range = (minimum(my_array[:,3,:]), maximum(my_array[:,3,:])

所以基本上,对于每个级别 n 所需维度(在本例中,维度 N2)。

我想要(更好的)代码将此操作推广到任何多维数组的任何所需维度 N,基本上存储该维度的不同 'settings/levels' 的范围。

您想要 extrema(my_array, dims = 1)(或 2、或 3),请参阅 extrema 的文档。

然后您可以使用 mapslices 指定调用中应包含冒号的维度:

julia> a = rand(1:10, 10, 3, 100);


julia> mapslices(extrema, a, dims = [1, 3])
1×3×1 Array{Tuple{Int64,Int64},3}:
[:, :, 1] =
 (1, 10)  (1, 10)  (1, 10)

请注意,目前存在一个未解决的问题,即 extrema 的性能比调用 minimummaximum here 更差,因此您可能需要检查是否这会导致性能问题。

每个切片对你有用吗?

julia> a = rand(10,3,100)
julia> b = [extrema(c) for c in eachslice(a,dims=2)]
3-element Array{Tuple{Float64,Float64},1}:
 (0.00019926768773892434, 0.9978490630494796)
 (0.00035292069651315927, 0.9998983532542789)
 (0.00012135841634353106, 0.9997039922122202)