2017-05-31 3 views
1

Wie kann ich ein numpy Bool-Array nach oben und unten rechtfertigen. Mit Justify meine ich, nehmen Sie die True-Werte, und verschieben Sie sie so, dass sie entweder die ersten Werte an der Spitze (wenn sie gerechtfertigt sind) oder die ersten Werte an der Unterseite sind. (Wenn sie nach unten gerechtfertigt sind)Python: rauf und runter rechtfertigen den Index eines bool numpy array

[[False True True True True True] 
    [False False True True False True] 
    [False True False True False False 
    [True True True True False True]] 

Wenn ich also rechtfertigen unten die wahren Werte des Bool Array oben gezeigt, würde es wie folgt aussehen:

[[False False False True False False] 
[False True True True False True] 
[False True True True False True] 
[True True True True True True]] 
+0

Was genau meinen Sie mit „rechtfertigen“? – blacksite

+0

Ich habe ein wenig mehr in meinen Bearbeitungen ausgearbeitet – bnicholl

Antwort

2

einfach sortiert es entlang jeder Spalte platzieren, die die wahren Werte nach unten drückt, während bringen up die Falschen für heruntergerechnete Version. Für eine berechtigte Version, flippen Sie die sortierte Version um.

Probelauf die Umsetzung zu präsentieren -

In [216]: mask 
Out[216]: 
array([[False, True, True, True, True, True], 
     [False, False, True, True, False, True], 
     [False, True, False, True, False, False], 
     [ True, True, True, True, False, True]], dtype=bool) 

In [217]: np.sort(mask,0) # Down justified 
Out[217]: 
array([[False, False, False, True, False, False], 
     [False, True, True, True, False, True], 
     [False, True, True, True, False, True], 
     [ True, True, True, True, True, True]], dtype=bool) 

In [218]: np.sort(mask,0)[::-1] # Up justified 
Out[218]: 
array([[ True, True, True, True, True, True], 
     [False, True, True, True, False, True], 
     [False, True, True, True, False, True], 
     [False, False, False, True, False, False]], dtype=bool) 
0

Es sieht aus wie Sie das erste zu verschiebende Array auf der Rückseite zu tun, was Sie "up rechtfertigen". Ich denke, es ist ein wenig schwierig, die Elemente in einem numpligen Array neu anzuordnen, daher konvertiere ich normalerweise in eine Standard-Python-Liste, ordne die Elemente neu und konvertiere zurück in ein numpy-Array.

def up_justify(np_array): 
    list_array = list(np_array) 
    first_list = list_array.pop(0) #removes first list 
    list_array.append(first_list) #adds list to back 
    return np.array(list_array) 

Ebenso können Sie nach unten rechtfertigen, indem sie die letzten Liste zu entfernen und an der Front, wie so

def down_justify(np_array): 
    list_array = list(np_array) 
    last_element = list_array.pop() 
    return np.array([last_element] + list_array)