我有一个二维的numpy数据数组,保存关于跟踪的元素对的对称信息,非常像锦标赛中的循环括号。保持这种类比,每个玩家占据一行,列数据是他们对特定对手的得分。对于"遗产"原因是,除了对自己的分数外,所有分数都是正数,这将是0。
让我们说我想找到给定球员的最差得分,同时返回他们为该得分所打的得分和对手。我怎么能这样做?
平庸的版本可能如下:
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中的代码正常工作。
谢谢!
编辑:This answer提供了很好的想法,但只获得整个数组的最小值,而不是单行。
答案 0 :(得分:2)
您可以选择给定的行,屏蔽自我评分并返回剩余的最小值。基本上你做了什么,但有一个额外的掩蔽步骤。我还建议使用np.argmin
而不是np.min
,因为它返回最小值的索引,在这种情况下提供更多信息:
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]
答案 1 :(得分:0)
这是一种方法。 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
对多个对手获得相同的低分,对手将成为一系列对手。