是否存在与numpy.argmax类似的Julia?

时间:2016-01-13 05:27:18

标签: numpy julia argmax

在Python中,有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])

argmax

朱莉娅与Numpy的indmax类似吗?我只找到np.argmax,它只接受一个向量,而不是二维数组{{1}}。

3 个答案:

答案 0 :(得分:10)

最快的实施通常是findmax(如果您愿意,可以让您一次减少多个维度)加上ind2sub

julia> a=rand(5,3)
5x3 Array{Float64,2}:
0.283078  0.202384  0.667838 
0.366416  0.671204  0.572707 
0.77384   0.919672  0.127949 
0.873921  0.9334    0.0210074
0.319042  0.200109  0.0944871

julia> mxval, mxindx = findmax(a, 2)
(
5x1 Array{Float64,2}:
0.667838
0.671204
0.919672
0.9334  
0.319042,

5x1 Array{Int64,2}:
11
7
8
9
5)

julia> ind2sub(size(a), vec(mxindx))[2]
5-element Array{Int64,1}:
3
2
2
2
1

答案 1 :(得分:3)

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

  

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

     

返回沿轴的最大值索引。

我怀疑单个Julia函数是否会这样做,但合并mapslicesindmax只是票证:

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(indmax, a, 2)
5x1 Array{Int64,2}:
 3
 2
 3
 1
 2

当然,因为Julia的数组索引是基于1的(而Numpy的数组索引是基于0的),所得到的Julia数组的每个元素与得到的Numpy数组中的对应元素相比偏移1。您可能想要也可能不想调整它。

如果你想获得一个向量而不是二维数组,你可以简单地在表达式的末尾添加[:]

julia> b = mapslices(indmax,a,2)[:]
5-element Array{Int64,1}:
 3
 2
 3
 1
 2

答案 2 :(得分:0)

要添加到jub0bs的答案中,Julia 1+中的argmax通过用np.argmax替换axis并返回CarthesianIndex来反映dims的行为。而不是沿给定维度的索引:

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)