Python 循环不会在if-else循环中输入else部分

Python 循环不会在if-else循环中输入else部分,python,numpy,Python,Numpy,问题: 我有一个3*3的转移矩阵和另一个3*1矩阵。把这两个相乘,我得到另一个3*1矩阵。我必须将新的3*1矩阵与原始的3*3矩阵相乘,这将得到另一个3*1矩阵。这必须持续,直到连续步骤中获得的3*1矩阵足够接近,或者如果完成10000次此类乘法(以先到者为准)。要查看它们是否足够接近,我有一个函数: np.allclose(上一个,新的)#确定此过程是否必须继续或停止 previous_x表示之前的3*1矩阵,new_x表示当前的新3*1矩阵 最大步数=10000 为了进入else循环,下面代

问题:

我有一个3*3的转移矩阵和另一个3*1矩阵。把这两个相乘,我得到另一个3*1矩阵。我必须将新的3*1矩阵与原始的3*3矩阵相乘,这将得到另一个3*1矩阵。这必须持续,直到连续步骤中获得的3*1矩阵足够接近,或者如果完成10000次此类乘法(以先到者为准)。要查看它们是否足够接近,我有一个函数:

np.allclose(上一个,新的)#确定此过程是否必须继续或停止

previous_x表示之前的3*1矩阵,new_x表示当前的新3*1矩阵

最大步数=10000

为了进入else循环,下面代码中的“res”肯定会在10k步数结束之前的某个时间点变为“True”。但由于某些原因,它不会发生。你能帮我解决这个问题吗

[守则]

def random_walk(P,x_0,max_steps = 10000):


    n_steps = 0

    def matrix_mult(P,x_0,n_steps):
        x = np.dot(P,x_0)
        res = np.allclose(x_0,x)
        n_steps = n_steps+1
        return x,res,n_steps

    x,res,n_steps = matrix_mult(P,x_0,n_steps)
    print(res)
    for i in range(max_steps-1):
        if(res==False):
            print('h')
            x_0 = x
            x=np.dot(P,x_0)
        else:
            print('g')
            x_0 = x
            x,res,n_steps = matrix_mult(P,x_0,n_steps)
            n_steps =i






    return x, n_steps
random_walk(np.array([[0,1,0.5],[1,0,0],[0,0,0.5]]),np.array([1,0,0]),max_steps = 10000)
你的乘法运算

P= np.array([[0,1,0.5],[1,0,0],[0,0,0.5]])
x_0= np.array([1,0,0])
x= np.dot(P,x_0)
收益率:

np.array([0., 1., 0.])
因此
np.allclose(x,x_0)
将返回
False
,而
else
分支永远不会执行,因为res可以更改的唯一位置是在循环之前和
else
分支中(只有在循环之前的函数调用求值为
res==True
时才能访问)

顺便说一句:尽量避免使用
==True/False
来比较布尔值。而应该使用
is True/False
。如果您想了解更多信息,请。

您的乘法

P= np.array([[0,1,0.5],[1,0,0],[0,0,0.5]])
x_0= np.array([1,0,0])
x= np.dot(P,x_0)
收益率:

np.array([0., 1., 0.])
因此
np.allclose(x,x_0)
将返回
False
,而
else
分支永远不会执行,因为res可以更改的唯一位置是在循环之前和
else
分支中(只有在循环之前的函数调用求值为
res==True
时才能访问)


顺便说一句:尽量避免使用
==True/False
来比较布尔值。而应该使用
is True/False
。如果你想了解更多这方面的信息,请阅读。

我想约特贝的回答暗示了这一点,但它可以更明确:

你的代码会卡在
if
/
else
的第一个分支中,因为一旦它进入,它就不会重新计算
res
。因此,如果
res
始终是
False
,它将一直保持
False
(你将继续执行第一个分支),直到你达到循环限制


要解决这个问题,您可能需要在循环的每个迭代中重新计算
res
。我真的不明白您使用单独的
matrix\u mult
函数在做什么,但可能每次都需要调用。您可能需要做的
if
更像是
if res:break
退出循环如果你发现乘法没有显著改变任何东西,那就早点开始。其他所有事情都应该无条件地在每次迭代中发生。

我认为约特比的回答暗示了这一点,但它可以更明确:

你的代码会卡在
if
/
else
的第一个分支中,因为一旦它进入,它就不会重新计算
res
。因此,如果
res
始终是
False
,它将一直保持
False
(你将继续执行第一个分支),直到你达到循环限制


要解决这个问题,您可能需要在循环的每个迭代中重新计算
res
。我真的不明白您使用单独的
matrix\u mult
函数在做什么,但可能每次都需要调用。您可能需要做的
if
更像是
if res:break
退出循环如果你发现乘法没有显著改变任何事情,那就早点开始。其他所有事情都应该无条件地在每次迭代中发生。

我想如果你将这个问题迁移到堆栈溢出,你可能会得到更多答案。我想如果你将这个问题迁移到堆栈溢出,你可能会得到更多答案谢谢@jottbe,完全理解w感谢@Blckknght,这是非常具体的,帮助解决了问题。感谢@jottbe,完全理解你的意思并纠正了它。感谢@Blckknght,这是非常具体的,帮助解决了问题。