2017-02-01 6 views
2

Ich habe ein zweidimensionales, numpiges Datenfeld, das symmetrische Informationen über Paare von Elementen enthält, die ich aufspüre, sehr ähnlich wie eine Round-Robin-Klammer in einem Turnier. Gemäß dieser Analogie belegt jeder Spieler eine Reihe mit den Kolumnen, die seine Punkte gegen einen gegebenen Gegner sind. Aus "Legacy" -Gründen werden alle Punktzahlen positive Zahlen sein, mit Ausnahme der Punktzahl gegen sich selbst.Numpy-Minimum für eine gegebene Spalte

Sagen wir, ich möchte die schlechteste Punktzahl eines bestimmten Spielers finden und sowohl die Punktzahl als auch den Gegner zurückgeben spielte für dieses Ergebnis. Wie könnte ich das tun?

könnte die mäßige Version wie folgt aussehen:

minimum = float('inf') 
min_opp = None 
for opponent_id in player_ids: 
    if opponent_id != player_id: 
     score = match_matrix[player_id, opponent_id] 
     if score < minimum: 
      minimum = score 
      min_opp = opponent_id 
return minimum, min_opp 

Aber das die Macht der numpy ist nicht zu verwenden. Ich denke, es sollte eine einfache Lösung geben, aber ich kann es nicht finden.

score = np.min(match_matrix[player, :]) 

gibt das Selbst-Score, und ich kann nicht ganz den Code aus this answer Arbeit richtig machen.

Dank!

EDIT: This answer bietet gute Ideen, sondern erhält nur das Minimum des gesamten Arrays, nicht eine einzige Zeile.

+0

Beantwortet [this] (http://stackoverflow.com/a/29394823/6614295) Ihre Frage? – jotasi

+0

Mögliches Duplikat von [Minimum von Numpy Array Ignoring Diagonal] (http://stackoverflow.com/questions/29394377/minimum-of-numpy-array-ignoring-diagonal) – jotasi

+1

@jotasi. Das beantwortet die Frage nach einer ganzen Matrix, nicht nach einem reihenweisen Fall. Ich würde es nicht für einen Betrogenen halten. –

Antwort

2

Sie können die angegebene Zeile auswählen, den Self-Score ausmaskieren und das Minimum des Rests zurückgeben. Grundsätzlich was Sie getan haben, aber mit einem zusätzlichen Maskierungsschritt. Ich würde auch mit np.argmin statt np.min empfehlen, weil es den Index des Minimums zurückgibt, die viel informativer ist in diesem Fall:

mask = np.ones(match_matrix.shape(1), dtype=np.bool) 
mask[player] = False 
opponent = np.argmin(match_matrix[player, mask]) 
if opponent >= player: 
    opponent += 1 
score = match_matrix[player, opponent] 
+0

Okay! Das ist lesbar und macht, was ich brauche. Vielen Dank. –

1

Hier ist eine Möglichkeit, es zu tun. np.min() gibt Ihnen den minimalen Wert in einer Reihe, und np.where kann Ihnen sagen, wo dieser Wert ist.

grid = np.random.randint(0,10,[5,5]) #Random matchups of 5x5 players 
player = 1 
low_score = np.min(grid[player][grid[player]>0]) #Only look at positive scores 
opponent = np.where(grid[player]==low_score)[0] 

Hier Gegner die gleiche geringe Punktzahl gegen mehrere Gegner eine Reihe von Gegnern, falls player bekam sein.

+0

'Argmin' + Indizierung ist wahrscheinlich effizienter als' min' + 'wo'. –

Verwandte Themen