Filtre la matriz numpy para retener solo una fila para un valor dado

Tengo una gran matriz de números nx 2 que está formateada como coordenadas (x, y). Me gustaría filtrar esta matriz para:

  1. Identificar pares de coordenadas con valores x duplicados.
  2. Mantenga solo el par de coordenadas de esos duplicados con el valor y más alto.

Por ejemplo, en la siguiente matriz:

arr = [[1, 4] [1, 8] [2, 3] [4, 6] [4, 2] [5, 1] [5, 2] [5, 6]] 

Me gustaría que el resultado fuera:

 arr = [[1, 8] [2, 3] [4, 6] [5, 6]] 

He explorado np.unique y np.where, pero no puedo descubrir cómo aprovecharlos para resolver este problema. ¡Muchas gracias!

Aquí hay una forma basada en np.maximum.reduceat

 def grouby_maxY(a): b = a[a[:,0].argsort()] # if first col is already sorted, skip this grp_idx = np.flatnonzero(np.r_[True,(b[:-1,0] != b[1:,0])]) grp_maxY = np.maximum.reduceat(b[:,1], grp_idx) return np.c_[b[grp_idx,0], grp_maxY] 

Alternativamente, si desea traer np.unique , podemos usarlo para encontrar grp_idx con np.unique(b[:,0], return_index=1)[1] .

Ejecución de la muestra

 In [453]: np.random.seed(0) In [454]: arr = np.random.randint(0,5,(10,2)) In [455]: arr Out[455]: array([[4, 0], [3, 3], [3, 1], [3, 2], [4, 0], [0, 4], [2, 1], [0, 1], [1, 0], [1, 4]]) In [456]: grouby_maxY(arr) Out[456]: array([[0, 4], [1, 4], [2, 1], [3, 3], [4, 0]])