python - 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')
解决方案
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)