ordenar la matriz numpy con predicado personalizado

Me gustaría ordenar mi número de arreglos de forma [n, 4], a lo largo de la primera dimensión (tamaño: n) utilizando un predicado personalizado que opera en el vector de la segunda dimensión (tamaño: 4). La versión en C ++ de lo que me gustaría hacer está más abajo, es realmente muy simple. He visto cómo hacer esto con las listas de python , pero no puedo encontrar la syntax para hacerlo con matrices numpy. es posible? La documentación en np. ordenar , np. argsort , np. lexsort no menciona predicados personalizados.

// c++ version vector v = init_v(); float[4] p = init_p(); std::sort(v.begin(), v.end(), [&p](const auto& lhs, const auto& rhs) { return myfn(p, lhs) > myfn(p, rhs); }); 

EDITAR: debajo está el código de Python que me gustaría usar para la clasificación. Es decir, para cada ‘fila’ (n: 4) de mi matriz, calculo el cuadrado de la distancia 3D euclidiana (es decir, solo las 3 primeras columnas) a un punto fijo.

 # these both operate on numpy vectors of shape [4] (ie a single row of my data matrix) def dist_sq(a,b): d = a[:3]-b[:3] return np.dot(d*d) def sort_pred(lhs, rhs, p): return dist_sq(lhs, p) > dist_sq(rhs, p) 

En numpy usted aplicaría la función de definición de orden (vectorizada) a la matriz, luego usaría np.argsort para ordenar por el resultado.

Esto es menos eficiente en espacio que la versión C ++, pero así es como generalmente se logra el rendimiento con numpy.

 import numpy as np def myfn(x): return np.sin(x[:, 1]) # example: sort by the sine of the second column a = np.random.randn(10, 4) predicate = myfn(a) # not sure if predicate is the best name for this variable order = np.argsort(predicate) a_sorted = a[order]