Tengo una gran matriz de números nx 2 que está formateada como coordenadas (x, y). Me gustaría filtrar esta matriz para:
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]])