Tengo una matriz que quiero ordenar de menor a mayor, pero quiero que devuelva los nombres de la matriz (G, F, H ...) en lugar de solo los números. ¿Cómo hago esto?

A=12.74087388       
B=12.48817861
C=12.31249807
D=12.95688859
E=12.49693343
F=11.51090636
G=10.16505019
H=11.99872655

Array=np.array([A,B,C,D,E,F,G,H])
sort=np.sort(Array)
0
Jellyse 3 mar. 2018 a las 18:53

4 respuestas

La mejor respuesta

Usa un diccionario:

d = dict(A=12.74087388,       
B=12.48817861,
C=12.31249807,
D=12.95688859,
E=12.49693343,
F=11.51090636,
G=10.16505019,
H=11.99872655)

Y ordenar por valor:

>>> sorted(d, key=d.get)
['G', 'F', 'H', 'C', 'B', 'E', 'A', 'D']

O mantener los números y ordenar por valor:

from operator import itemgetter
print(sorted(d.items(), key=itemgetter(1)))

Salida:

[('G', 10.16505019),
 ('F', 11.51090636),
 ('H', 11.99872655),
 ('C', 12.31249807),
 ('B', 12.48817861),
 ('E', 12.49693343),
 ('A', 12.74087388),
 ('D', 12.95688859)]
3
Mike Müller 3 mar. 2018 a las 16:18

Como señaló @jonrsharpe, el nombre de la variable no es una propiedad de esos valores, por lo que deberá adjuntarlo de manera diferente. Creo que la forma más fácil es hacerlo así:

my_array = [[12.74087388, 'A'], [12.48817861, 'B'], etc]
my_sorted_array = sorted(my_array)
my_sorted_named_array = [i[1] for i in my_sorted_array]
2
Nathan 3 mar. 2018 a las 16:00

Esta es una solución basada en el diccionario, como se sugiere en los comentarios.

lst = [12.74087388, 12.48817861, 12.31249807, 12.95688859,
       12.49693343, 11.51090636, 10.16505019, 11.99872655]

d = dict(zip(list('ABCDEFGH'), lst))
sorted_names = list(zip(*sorted(d.items(), key=lambda x: x[1])))[0]

# ('G', 'F', 'H', 'C', 'B', 'E', 'A', 'D')
0
jpp 3 mar. 2018 a las 16:09

Supongo que prefiere una lista de tuplas en lugar de un diccionario en caso de que tenga letras duplicadas.

data = [
  ('A', 12.74087388),
  ('B', 12.48817861),
  ('C', 12.31249807),
  ('D', 12.95688859),
  ('E', 12.49693343),
  ('F', 11.51090636),
  ('G', 10.16505019),
  ('H', 11.99872655)
]
dt = np.dtype([('letter', np.unicode_, 1), ('num', np.float64)])
arr = np.array(data, dtype=dt)
arr.sort(order='num')
0
IgSaf 3 mar. 2018 a las 16:47