我试图创建一个函数来检查矩阵和向量是否是随机的(矩阵和向量的所有列的元素之和=1),如果是,则在M和p之间应用矩阵积,否则会产生错误。我创建了一个名为is_sto的函数来验证向量的sum=1。 我尝试了一些不起作用的东西。。。我对三重和有点怀疑,但我做得再好不过了。有可能得到一个提示吗? 非常感谢
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
之后(我希望您刚刚在Stackoverflow中犯了复制粘贴错误)。这使得b向量始终设置为[0,0]
,因为您在函数中执行的操作具有不同的作用域,因为它们是函数的局部变量。因此,它总是返回ValueError
步骤
b[None,:]=is_sto(column)
中存在逻辑错误这将为M.T
的每一列设置值b[0] and b[1]
到[1,1]
。我非常怀疑你是想这么做,因为这毫无意义。我相信您想要的是第一列得到b[0] = 1
,第二列得到b[1] = 1
代码中的
no.dot
没有return
我建议使用以下代码,使整个问题更加简单,并且没有错误。这也消除了图片中的向量b,从而消除了错误的布尔索引
v相当于:
sum(row)==1 for row in M.T
返回列数的长度列表,如果第i列的和为1,则元素True位于位置iall是一个内置的python函数,用于检查列表中的所有元素是否为真。如果是这样,则返回True。在这里,当且仅当所有列都是sum 1时,它返回True
此外,还可以选中
if v == True:
。您只需编写if v:
,它更简单;)如果您想要更简单的解决方案,您可以编写:
此外,我认为你需要在某个地方放一张申报表;)
如果您想要
np.dot(M,p)
的结果,请通过return np.dot(M,p)
更改它相关问题 更多 >
编程相关推荐