有没有类似于numpy.argmax的Julia函数?

11

在Python中,有numpy.argmax

In [7]: a = np.random.rand(5,3)

In [8]: a
Out[8]: 
array([[ 0.00108039,  0.16885304,  0.18129883],
       [ 0.42661574,  0.78217538,  0.43942868],
       [ 0.34321459,  0.53835544,  0.72364813],
       [ 0.97914267,  0.40773394,  0.36358753],
       [ 0.59639274,  0.67640815,  0.28126232]])

In [10]: np.argmax(a,axis=1)
Out[10]: array([2, 1, 2, 0, 1])

是否有Julia的类似于Numpy的argmax函数?我只找到了一个indmax函数,它只接受向量,而不是像np.argmax一样接受二维数组。


现在已经有了一个0.7-alpha版本的解决方案。 - ederag
3个回答

11

如果您希望在多个维度上同时减少,则通常会使用最快的实现findmax

julia> a = rand(5, 3)
5×3 Array{Float64,2}:
 0.867952  0.815068   0.324292
 0.44118   0.977383   0.564194
 0.63132   0.0351254  0.444277
 0.597816  0.555836   0.32167 
 0.468644  0.336954   0.893425

julia> mxval, mxindx = findmax(a; dims=2)
([0.8679518267243425; 0.9773828942695064; … ; 0.5978162823947759; 0.8934254589671011], CartesianIndex{2}[CartesianIndex(1, 1); CartesianIndex(2, 2); … ; CartesianIndex(4, 1); CartesianIndex(5, 3)])

julia> mxindx
5×1 Array{CartesianIndex{2},2}:
 CartesianIndex(1, 1)
 CartesianIndex(2, 2)
 CartesianIndex(3, 1)
 CartesianIndex(4, 1)
 CartesianIndex(5, 3)

ind2sub已在0.7中被移除:https://discourse.julialang.org/t/psa-replacement-of-ind2sub-sub2ind-in-julia-0-7/14666,请使用CartesianIndex代替。 - BoZenKhaa

3
根据Numpy文档,argmax提供以下功能:

numpy.argmax(a, axis=None, out=None)

返回沿轴的最大值的索引。

我怀疑Julia没有单独的一个函数可以做到这一点,但是结合mapslicesargmax就可以了。
julia> a = [ 0.00108039  0.16885304  0.18129883;
             0.42661574  0.78217538  0.43942868;
             0.34321459  0.53835544  0.72364813;
             0.97914267  0.40773394  0.36358753;
             0.59639274  0.67640815  0.28126232] :: Array{Float64,2}

julia> mapslices(argmax,a,dims=2)
5x1 Array{Int64,2}:
 3
 2
 3
 1
 2

当然,由于Julia的数组索引是从1开始的(而Numpy的数组索引是从0开始的),因此结果Julia数组的每个元素与对应的Numpy数组的元素相比都会偏移1。您可能需要或不需要调整它。
如果您想获得一个向量而不是2D数组,只需在表达式末尾添加[:]即可:
julia> b = mapslices(argmax,a,dims=2)[:]
5-element Array{Int64,1}:
 3
 2
 3
 1
 2

自Julia 0.7起,请使用argmax代替indmax:https://dev59.com/kFoU5IYBdhLWcg3wamga - BoZenKhaa
1
@BoZenKhaa 随意修改我的问题。 - jub0bs

1

补充jub0bs的回答,Julia 1+中的argmaxnp.argmax行为相同,通过替换axis关键字为dims关键字,在给定维度上返回CarthesianIndex而不是索引:

julia>  a = [ 0.00108039  0.16885304  0.18129883;

                0.42661574  0.78217538  0.43942868;      

                0.34321459  0.53835544  0.72364813;      

                0.97914267  0.40773394  0.36358753;      

                0.59639274  0.67640815  0.28126232] :: Array{Float64,2}

julia> argmax(a, dims=2)
5×1 Array{CartesianIndex{2},2}:
CartesianIndex(1, 3)
CartesianIndex(2, 2)
CartesianIndex(3, 3)
CartesianIndex(4, 1)
CartesianIndex(5, 2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接