3

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

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

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,:])

所以基本上,对于所需维度(在本例中为维度)my_array[:,n,:]的每个级别,您将获得整个 n 维子数组的最小值(分别为最大值),该子数组由索引操作(如 , )挑选出来。nN2

我想要(更好的)代码,将这个操作推广到任何N多维数组的任何所需维度,基本上存储该维度的不同“设置/级别”的范围。

4

2 回答 2

3

您想要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比调用minimum和更差maximum here,因此您可能需要检查这是否会导致性能问题。

于 2020-06-05T12:21:57.310 回答
2

每一片都适合你吗?

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)
于 2020-06-05T15:03:16.113 回答