【问题标题】:Python stochastic matrixPython随机矩阵
【发布时间】:2020-08-06 08:32:26
【问题描述】:

我正在尝试创建一个函数来检查矩阵和向量是否是随机的(矩阵和向量的所有列的元素总和 =1)如果是,则它应用 M 和之间的矩阵乘积p 否则会引发错误。我创建了一个名为 is_sto 的函数来验证向量的 sum=1。 我尝试了一些不起作用的方法......我对三重 AND 有点怀疑,但我不能做得更好。有没有可能有提示? 非常感谢

p=np.array([[0.5],[0.5]])
M=np.array([[0.3,0.5], [0.7,0.5]])
b=np.zeros(2)

def matrix_stoch (p,M):
   
 for column in M.T:
   
   b[None,:]=is_sto(column)
    
v= (b[0] and b[1] and is_sto(p))

if v == True:
       np.dot(M,p)
else:
      raise ValueError('no stochastic matrix')

【问题讨论】:

    标签: python numpy stochastic


    【解决方案1】:

    v 等价于:

    all(sum(row) == 1 for row in M.T) and sum(float(elt) for elt in p) == 1
    

    sum(row)==1 for row in M.T 返回长度为您的列数的列表,如果第 i 列的总和为 1,则元素 True 位于位置 i。

    all 是一个内置的 python 函数,用于检查列表的所有元素是否为 True。如果是这种情况,则返回 True。当且仅当所有列的总和为 1 时,它才返回 True。

    另外,您检查if v == True:。你可以直接写if v:,更简单;)

    def matrix_sto(p,M):
        if all(sum(row) == 1 for row in M.T) and sum(float(elt) for elt in p) == 1:
            np.dot(M,p)
        else:
            raise ValueError('no stochastic matrix')
    

    如果你想要一个更简单的解决方案,你可以这样写:

    import numpy as np
    
    def matrix_sto(p,M):
        bool = True
        for row in M.T:
            bool = bool and sum(row) == 1
        
        sum_vector=0
        for elt in p:
            sum_vector += float(elt)
        bool = bool and sum_vector == 1
        if bool:
            np.dot(M,p)
        else:
            raise ValueError('no stochastic matrix')
    

    此外,我认为您需要在某处放置一个 return ;)

    如果您想要np.dot(M,p) 的结果,请将其更改为return np.dot(M,p)

    【讨论】:

    • sum(row) == 1 for row in M.T 是那里的生成器表达式,不返回列表
    【解决方案2】:

    你写的函数有多个问题-

    1. 您的代码中的缩进不正确,它将代码放在函数之外的v 之后(我希望您刚刚在 Stackoverflow 中犯了复制粘贴错误)。这使得 b 向量始终设置为[0,0],因为您在函数内部执行的操作具有不同的范围,因为它们是函数的局部变量。因此,这总是返回 ValueError

    2. 步骤b[None,:]=is_sto(column) 中存在逻辑错误。 这会将b[0] and b[1] 的值设置为[1,1] 的每列M.T。我非常怀疑您是否正在尝试这样做,因为这没有任何意义。我相信您想要的是获得第一列的b[0] = 1 和第二列的b[1] = 1

    3. 您的代码中没有return 对应的no.dot

    我建议使用以下代码,它可以使整个问题变得更加简单且没有错误。这也消除了图片中的向量 b,从而消除了错误的布尔索引。

    p=np.array([[0.5],[0.5]])
    M=np.array([[0.3,0.5], [0.7,0.5]])
    
    def is_sto(arr):
        return np.sum(arr)==1
    
    def matrix_stoch(p,M):
        M_sto = [is_sto(i) for i in M.T]
        p_sto = is_sto(p)
    
        print('Stochastic check on columns of M: ', M_sto)
        print('Stochastic check on vector p: ', p_sto)
    
        if all(M_sto) and p_sto:
            return np.dot(M,p)
        else:
            raise ValueError('no stochastic matrix')
    
    matrix_stoch(p,M)
    
    Stochastic check on columns of M:  [True, True]
    Stochastic check on vector p:  True
    
    array([[0.4],
           [0.6]])
    

    【讨论】:

    • 非常感谢这有帮助
    • 很高兴为您提供帮助。如果有帮助,请随时标记和投票!
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2016-06-30
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2020-02-17
    相关资源
    最近更新 更多