给定列的Numpy最小值

时间:2017-02-01 16:59:03

标签: python numpy

我有一个二维的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提供了很好的想法,但只获得整个数组的最小值,而不是单行。

2 个答案:

答案 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对多个对手获得相同的低分,对手将成为一系列对手。