consider the array
a
a = np.array([
[5, 4],
[4, 5],
[2, 2],
[6, 1],
[3, 7]
])
a.argmin(0)
array([2, 3])
a.max(0)
array([6, 7])
# max values
array([5, 5])
# argmax before mins
array([0, 1])
Here's one approach using broadcasting

b = np.where(a.argmin(0) >= np.arange(a.shape[0])[:,None],a,np.nan)
idx = np.nanargmax(b,axis=0)
out = a[idx,np.arange(a.shape[1])]
Sample run 
In [38]: a
Out[38]:
array([[5, 4],
[4, 5],
[2, 2],
[6, 1],
[3, 7]])
In [39]: b = np.where(a.argmin(0) >= np.arange(a.shape[0])[:,None],a,np.nan)
...: idx = np.nanargmax(b,axis=0)
...: out = a[idx,np.arange(a.shape[1])]
...:
In [40]: idx
Out[40]: array([0, 1])
In [41]: out
Out[41]: array([5, 5])
Alternatively, if a
has positive numbers only, we could get idx
simply by multiplying with the mask and using argmax
: (a*mask).argmax(0)
.