Python随机矩阵

2024-04-19 05:59:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: and函数元素isdef错误npzeros
2条回答

您编写的函数存在多个问题-

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

  2. 步骤b[None,:]=is_sto(column)中存在逻辑错误这将为M.T的每一列设置值b[0] and b[1][1,1]。我非常怀疑你是想这么做,因为这毫无意义。我相信您想要的是第一列得到b[0] = 1,第二列得到b[1] = 1

  3. 代码中的no.dot没有return

我建议使用以下代码,使整个问题更加简单,并且没有错误。这也消除了图片中的向量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]])

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。在这里,当且仅当所有列都是sum 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)更改它

相关问题 更多 >