2017-03-13 27 views
5

Jak sortujesz, operujesz, a następnie odznaczasz wynik?Jak sortować unsort: array (1) .sort transform array (2) -> array (3) .unsort (odwrócona tablica (1) .sort

Załóżmy mam tablicy pływaka p1 = 0.15,0.3, 0.25, 0.12, ... jest klasyfikowane do:.. p2 = sort(p1) funkcji (pracy z p2 jako wejście) powoduje p3: p3 = f(p2, x, y, ...) dla niektórych funkcji f

Jak mogę unsort p3 w najmądrzejszy. sposób (odwrotnie, jak sortowano p1)

tj. p4 = unsort(p3) < - p4 nieposortowane do tego samego zamówienia co p1, dla porównania (x-plot) z p1?

Odpowiedz

0

Jednym ze sposobów jest użycie numpy.argsort, aby znaleźć indeksy, które będą sortować początkową tablicę. Te same wskaźniki mogą być wykorzystane do un-sort swojej tablicy w jej wyniku, w następujący sposób:

a = np.array([5, 2, 4, 3, 1]) 
i = np.argsort(a) # i = array([4, 1, 3, 2, 0]) 

# b will be the sorted version of a  
b = a[i]    # b = array([1, 2, 3, 4, 5]) 
# c is the function on b 
c = b**2    # c = array([ 1, 4, 9, 16, 25]) 

# d will hold the un-sorted result 
d = np.empty(a.shape) 
d[i] = c    # d = array([ 25., 4., 16., 9., 1.]) 

Ale to, że konieczna będzie wstępnie zadeklarować d przed indeksowania.

2

Trzeba podwójne argsort tutaj, aby zachować porządek:

In [6]: a 
Out[6]: array([5, 4, 8, 3, 6, 1, 2, 4, 9, 6]) 

In [7]: b=sort(a) 

In [8]: b 
Out[8]: array([1, 2, 3, 4, 4, 5, 6, 6, 8, 9]) 

In [9]: ii=a.argsort().argsort() 

In [10]: c=b*b 

In [11]: c 
Out[11]: array([ 1, 4, 9, 16, 16, 25, 36, 36, 64, 81]) 

In [12]: c[ii] 
Out[12]: array([25, 16, 64, 9, 36, 1, 4, 16, 81, 36]) 
+0

Dzięki - rozwiązano mój problem (przepraszam za późną powtórkę). I dowiedziałem się więcej na podstawie innych odpowiedzi :-) Użyłem tego, aby stworzyć własną prostą "Normalną zmianę wyników". –

0

Aby unsort listę w python za pomocą wbudowanego w funkcji:

Program:

a=[589,273,981,642,702,883,319,128] 
print("a",a) 
b=[(p[1],p[0]) for p in enumerate(a)] 
print("b",b) 
c=sorted(b) 
print("c",c) 
d=[p[1] for p in c] 
z=[p[0] for p in c] 
print("d",d) 
print("z",z) 
y=zip(d,z) 
print("y",y) 
x=list(y) 
print("x",x) 
w=sorted(x) 
print("w",w) 
v=[p[1] for p in w] 
print("v",v) 
# unsort of z in one statement: 
u=[r[1] for r in 
    sorted(list(zip([q[1] for q in 
     sorted([(p[1],p[0]) for p in 
      enumerate(a)])],z)))] 

wyjściowa:

a [589, 273, 981, 642, 702, 883, 319, 128] 
b [(589, 0), (273, 1), (981, 2), (642, 3), (702, 4), (883, 5), (319, 6), (128, 7)] 
c [(128, 7), (273, 1), (319, 6), (589, 0), (642, 3), (702, 4), (883, 5), (981, 2)] 
d [7, 1, 6, 0, 3, 4, 5, 2] 
z [128, 273, 319, 589, 642, 702, 883, 981] 
y <zip object at 0x035E38A0> 
x [(7, 128), (1, 273), (6, 319), (0, 589), (3, 642), (4, 702), (5, 883), (2, 981)] 
w [(0, 589), (1, 273), (2, 981), (3, 642), (4, 702), (5, 883), (6, 319), (7, 128)] 
v [589, 273, 981, 642, 702, 883, 319, 128] 
u [589, 273, 981, 642, 702, 883, 319, 128]