【问题标题】:loop through numpy matrix elements循环遍历numpy矩阵元素
【发布时间】:2023-09-27 10:55:01
【问题描述】:

我有以下矩阵,其中每个元素代表特定得分线的概率。

主队的进球数在 y 轴上,客队的进球数在 x 轴上。例如,0-0 的比分是 1.21,4-3 的比分是 0.84。我知道主场获胜的概率等于

   np.sum(np.tril(match_score_matrix, -1))

平局的概率等于:

   np.sum(np.diag(match_score_matrix))

失败的概率等于:

   np.sum(np.triu(match_score_matrix, 1)),

现在,我想知道每个目标差异的概率。在此矩阵中,可能出现以下目标差异结果 [-6, -5, ..., 0, ..., 15)。如何编写一个循环来计算每个结果的概率?

def get_probabilities(match_score_matrix, max_goals_home, max_goals_away):
    return dict({'max_goals_away': np.something,
                 '-5', np.something,
                 '-4', np.something,
                 ... 
                 '0', np.diag(match_score_matrix)),
                 '1', np.something
                 ...
                 'max_goals_home', np.something })

如何在易于使用的循环中编写此代码?提前谢谢!

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    考虑在np.diagonal 中使用偏移。因为对角线是主客队进球数相等时,向上偏移是客队比主队高一球的概率。相反,向下偏移是主队比客队高一球的概率。因此,将两个概率相加。

    # AWAY ONE GOAL HIGHER
    np.sum(np.diagonal(match_score_matrix, offset=1))    
    # HOME ONE GOAL HIGHER
    np.sum(np.diagonal(match_score_matrix, offset=-1))
    
    # AWAY TWO GOALS HIGHER
    np.sum(np.diagonal(match_score_matrix, offset=2))    
    # HOME TWO GOALS HIGHER
    np.sum(np.diagonal(match_score_matrix, offset=-2))
    ...
    
    # AWAY MAX GOALS HIGHER USING array.shape
    np.sum(np.diagonal(match_score_matrix, offset=match_score_matrix.shape[0]))
    # HOME MAX GOALS HIGHER USING array.shape
    np.sum(np.diagonal(match_score_matrix, offset=-match_score_matrix.shape[0]))
    

    对于你需要的字典,使用字典理解

    def get_probabilities(match_score_matrix, max_goals_home, max_goals_away):
    
        # DICTIONARY COMPREHENSION 
        return {str(i): np.sum(np.diagonal(match_score_matrix, offset=i)) for i in range(-15,15)}
    

    【讨论】:

      【解决方案2】:

      您可以使用np.diag 提取k-th 对角线,然后对其求和。

      {str(i):np.sum(np.diag(match_score_matrix,k=i)) for i in range(-15,8)}
      

      【讨论】: