I have np 2d array and want to get indexes of max by row.
For example:
3 2 1 3 1
0 4 4 1 2
1 0 1 1 2
Maximum by row is
[3, 4, 2]
.
Indexes are
[(0,0) (0,3) (1,1) (1,2) (2,4)]
I tried smth like this
buf = np.apply_along_axis(lambda x: zip(np.where(x == np.max(x))), axis=1, arr=B)
or this
buf = np.where(B == np.max(B,axis = 1))
But it doesnt work.
Also I can't use loops (otherwise I wouldn't use numpy either)
CodePudding user response:
After finding max
you need set each max as one row then searching in base array like below:
>>> a = np.array([[3 ,2 ,1 ,3 ,1],[0, 4 ,4 ,1 ,2],[1, 0, 1, 1, 2]])
>>> np.max(a, axis=1)
array([3, 4, 2])
>>> np.max(a, axis=1)[:,None]
array([[3],
[4],
[2]])
>>> np.argwhere(a==np.max(a,1)[:,None])
array([[0, 0],
[0, 3],
[1, 1],
[1, 2],
[2, 4]])
If you want output like as tuple
in your question you can try this:
>>> list(map(tuple, np.argwhere(a==np.max(a,1)[:,None])))
[(0, 0), (0, 3), (1, 1), (1, 2), (2, 4)]