2017-02-01 4 views
2

私は追跡している要素のペアについて対称的な情報を保持する2次元のデータ配列を持っています。これはトーナメントのラウンドロビンブラケットに非常によく似ています。その類推を踏まえて、各プレイヤーはある列を占有し、列データは与えられた相手に対する得点となる。 「レガシー」の理由で、すべての得点は自分自身に対するスコアを除いて正の数になります.与えられた列のナンシー最小値

与えられたプレイヤーの最悪の得点を求めて、得点と相手の両方を返したいとしますそのスコアのために遊んだ。どうすればいい?

平凡なバージョンは、次のようになります。

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 

しかし、それがすべてでnumpyののパワーを使用していません。私は簡単な解決策が必要なように感じますが、私はそれを見つけることができません。

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

は、自己のスコアを与え、私はかなり正確にthis answer仕事からコードを作成することはできません。

ありがとうございます!

EDIT:This answerは良いアイデアを提供しますが、アレイ全体ではなく、単一の行であることがわかります。

+0

[this](http://stackoverflow.com/a/29394823/6614295)に質問がありますか? – jotasi

+0

対角を無視しているナンシーアレイの最小値の可能な複製(http://stackoverflow.com/questions/29394377/minimum-of-numpy-array-ignoring-diagonal) – jotasi

+1

@jotasi。これは、行単位の場合ではなく、行列全体に対する質問に答えるものです。私はそれを欺瞞とは見なしません。 –

答えて

2

特定の行を選択して、自己スコアをマスクし、残りの最小値を返すことができます。基本的には何をしたのですか?ここではそれを行うための一つの方法だ

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

よろしくお願いします。それはわかりやすく、私が必要とするものを実行します。本当にありがとう。 –

1

:それははるかに有益この場合、最小のインデックスを返しますので、私はまた、np.argmin代わりのnp.minを使用することをお勧めします。 np.min()は最小値を連続して表示し、np.whereはその値がどこにあるかを示します。ここで

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] 

playerは、複数の相手に同じ低得点を得た場合には、反対派は、相手の配列になります。

+0

'argmin' +のインデックス付けはおそらく' min' + 'where'より効率的です。 –

関連する問題