2017-03-13 12 views
5

Wie sortieren, operieren Sie und lösen Sie das Ergebnis?So sortieren Sie unsort: array (1) .sort Transformation von array (2) -> array (3) .unsort (umgekehrtes array (1) .sort

gehe ich davon p1 = 0.15,0.3, 0.25, 0.12, ... einen Schwimmer Array muss es sortiert wird:.. p2 = sort(p1) eine Funktion (Betrieb mit p2 als Eingabe) ergibt p3: p3 = f(p2, x, y, ...) für eine Funktion f

wie kann ich p3 in der cleverste unsort. Weg? (umgekehrt wie p1 wurde sortiert)

: p4 = unsort(p3) < - p4 unsortiert in derselben Reihenfolge wie p1, zum Vergleich (x-plot) mit p1?

Antwort

0

Eine Möglichkeit besteht darin, numpy.argsort zu verwenden, um die Indizes zu finden, die das ursprüngliche Array sortieren. Die gleichen Indizes können auf un-Art Ihres Array in das Ergebnis verwendet werden, wie folgt:

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.]) 

Aber dies erfordert, dass Sie d vor der Indizierung im Voraus erklären.

2

Sie benötigen einen Doppel argsort hier um die Reihenfolge zu halten:

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

Danke - das ist gelöst mein Problem (Entschuldigung für die späte Wiedergabe). Und ich habe mehr von den anderen Antworten gelernt :-) Ich habe daraus meine eigene einfache "Normal Scores Transform" gemacht. –

0

eine Liste in Python unsort in Funktionen eingebaut werden:

Programm:

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)))] 

Ausgang:

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]