首页 > 解决方案 > Python随机矩阵

问题描述

我正在尝试创建一个函数来检查矩阵和向量是否是随机的(矩阵和向量的所有列的元素总和=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')

标签: pythonnumpystochastic

解决方案


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')

此外,我认为您需要在某处退货;)

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


推荐阅读