¿Ordenar matriz de cadenas numpy con números negativos?

Tengo un problema al ordenar una matriz numpy que tiene números como cadenas. Necesito mantener estos como cadenas porque hay otras palabras después de los enteros.

Está ordenando números negativos en orden inverso:

>>> import numpy as np >>> a = np.array(["3", "-2", "-1", "0", "2"]) >>> a.sort() >>> a array(['-1', '-2', '0', '2', '3'], dtype='|S2') 

Hubiera esperado que la salida fuera:

 array(['-2', '-1', '0', '2', '3'], dtype='|S2') 

¿Alguna sugerencia?

Usted podría utilizar la clasificación natural :

 import numpy as np import re def atoi(text): try: return int(text) except ValueError: return text def natural_keys(text): ''' alist.sort(key=natural_keys) sorts in human order http://nedbatchelder.com/blog/200712/human_sorting.html ''' return [ atoi(c) for c in re.split('([-]?\d+)', text) ] a = np.array(["3", "-2", "-1", "0", "2", "word"]) print(sorted(a,key=natural_keys)) # ['-2', '-1', '0', '2', '3', 'word'] a = np.array(["3", "-2", "-1", "0", "2", "word", "-1 word", "-2 up"]) print(sorted(a,key=natural_keys)) # ['-2', '-2 up', '-1', '-1 word', '0', '2', '3', 'word'] 

Suponiendo que haya un espacio detrás del entero antes de las otras palabras, entonces si a fuera una list python regluar harías:

 a.sort(key = lambda s: int(s.split()[0])) 

No estoy seguro de cuál es el equivalente en numpy (no se ve cómo especificar una clave), pero una posibilidad es convertir a una lista y volver a una matriz.