2016-01-13 3 views
6

В Python есть numpy.argmax:Есть ли аналог Julia для 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-х argmax? Я нашел только indmax, которые принимают только вектор, а не двумерный массив как np.argmax.

ответ

9

Самая быстрая реализация обычно будет 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 
3

В соответствии с документацией Numpy, argmax обеспечивает следующую функциональность:

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

Возвращает индексы максимальных значений вдоль оси.

Я сомневаюсь, что одна функция Джулия делает это, но объединение mapslices и indmax только билет:

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 

Конечно, так как индексация массива Юли в 1 на основе (в то время как индексация массива Numpy является 0 на основе) каждый элемент результирующего массива Julia смещается на 1 по сравнению с соответствующим элементом в полученном массиве Numpy. Вы можете или не хотите его корректировать.

Если вы хотите, чтобы получить вектор, а не 2D массива, вы можете просто лавировать [:] в конце выражения:

julia> b = mapslices(indmax,a,2)[:] 
5-element Array{Int64,1}: 
3 
2 
3 
1 
2 
Смежные вопросы