2017-10-03 4 views
2

Ich habe ein numpy Array X, und ich möchte ein anderes Array Y, deren Einträge sind die Indizes von die n größten Werte von X also nehme ich habe:Rückgabe der N größten Werte Indizes in einem mehrdimensionalen Array (kann Lösungen für eine Dimension aber nicht Multi-Dimension finden)

a =np.array[[1, 3, 5], [4, 5 ,6], [9, 1, 7]] 

dann sagen, wenn ich die ersten 5 "maxs" 's-Indizes-hier 9, 7, 6, 5, will 5 sind die maxs und ihre Indizes sind:

b=np.array[[2, 0], [2 2], [ 2 1], [1 1], [0 , 2]) 

ich habe in der Lage gewesen, einige Lösungen zu finden und diese Arbeit für ein eindimensionales Array machen wie

c=np.array[1, 2, 3, 4, 5, 6]: 

def f(a,N): 
    return np.argsort(a)[::-1][:N] 

Aber nicht in der Lage, etwas zu generieren, das in mehr als einer Dimension funktioniert. Vielen Dank!

+0

danke, es ist schon so weit ein harter Tag haha ​​ – user7351362

Antwort

2

Ansatz # 1

den argsort Indizes auf seiner abgeflachten Version und dort die letzten N Indizes auswählen. Dann erhalten die entsprechenden Zeilen- und Spaltenindizes -

N = 5 
idx = np.argsort(a.ravel())[-N:][::-1] #single slicing: `[:N-2:-1]` 
topN_val = a.ravel()[idx] 
row_col = np.c_[np.unravel_index(idx, a.shape)] 

Probelauf -

# Input array 
In [39]: a = np.array([[1,3,5],[4,5,6],[9,1,7]]) 

In [40]: N = 5 
    ...: idx = np.argsort(a.ravel())[-N:][::-1] 
    ...: topN_val = a.ravel()[idx] 
    ...: row_col = np.c_[np.unravel_index(idx, a.shape)] 
    ...: 

In [41]: topN_val 
Out[41]: array([9, 7, 6, 5, 5]) 

In [42]: row_col 
Out[42]: 
array([[2, 0], 
     [2, 2], 
     [1, 2], 
     [1, 1], 
     [0, 2]]) 

Ansatz # 2

Für Leistung können wir np.argpartition Top-N erhalten verwenden Indizes ohne sortierte Reihenfolge, so -

idx0 = np.argpartition(a.ravel(), -N)[-N:] 

Um die sortierten Reihenfolge zu erhalten, brauchen wir eine weitere Runde von argsort -

idx = idx0[a.ravel()[idx0].argsort()][::-1] 
+0

schön. das ist fantastisch! ich danke dir sehr! – user7351362

Verwandte Themen