是否有类似于 numpy.argmax 的 Julia?
Is there a Julia analogue to numpy.argmax?
在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])
是否有与 Numpy 类似的 Julia argmax
?我只找到了一个indmax
,它只接受一个向量,而不是一个二维数组,如np.argmax
。
根据 Numpy 文档,argmax
提供以下功能:
numpy.argmax(a, axis=None, out=None)
Returns the indices of the maximum values along an axis.
我怀疑一个 Julia 函数能做到这一点,但结合 mapslices
and argmax
就可以了:
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 开始的),与结果 Numpy 数组中的相应元素相比,生成的 Julia 数组的每个元素都偏移 1。您可能想也可能不想调整它。
如果你想得到一个向量而不是一个二维数组,你可以简单地在表达式的末尾添加 [:]
:
julia> b = mapslices(argmax,a,dims=2)[:]
5-element Array{Int64,1}:
3
2
3
1
2
最快的实现通常是 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)
要添加到 jub0bs 的答案,argmax
in Julia 1+ mirrors the behavior of np.argmax
, by replacing axis
with dims
keyword, returning 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)
在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])
是否有与 Numpy 类似的 Julia argmax
?我只找到了一个indmax
,它只接受一个向量,而不是一个二维数组,如np.argmax
。
根据 Numpy 文档,argmax
提供以下功能:
numpy.argmax(a, axis=None, out=None)
Returns the indices of the maximum values along an axis.
我怀疑一个 Julia 函数能做到这一点,但结合 mapslices
and argmax
就可以了:
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 开始的),与结果 Numpy 数组中的相应元素相比,生成的 Julia 数组的每个元素都偏移 1。您可能想也可能不想调整它。
如果你想得到一个向量而不是一个二维数组,你可以简单地在表达式的末尾添加 [:]
:
julia> b = mapslices(argmax,a,dims=2)[:]
5-element Array{Int64,1}:
3
2
3
1
2
最快的实现通常是 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)
要添加到 jub0bs 的答案,argmax
in Julia 1+ mirrors the behavior of np.argmax
, by replacing axis
with dims
keyword, returning 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)