Python3上的乘法矩阵

Python3上的乘法矩阵,python,numpy,matrix,Python,Numpy,Matrix,有人知道我为什么得到了错误的结果吗?我知道代码的最后一行有个错误,f=p0*pn*p import numpy as np def passage(n,i,j): # this function calculate the first time passage distribution after n #steps starting at i and end at j. p=np.matrix([[0,1,0,0],[0.5,0,0.5,0],[0,.5,0,.5]

有人知道我为什么得到了错误的结果吗?我知道代码的最后一行有个错误,f=p0*pn*p

import numpy as np

def passage(n,i,j):
    # this function calculate the first time passage distribution after n 
    #steps starting at i and end at j.

    p=np.matrix([[0,1,0,0],[0.5,0,0.5,0],[0,.5,0,.5],[0,0,1,0]])

    p0=p[:]
    for k in range(len(p)): # let elements in column j be zeros
        p0[k,j]=0

    p1=p0[:]
    for k in range(len(p)): #let element in column j and row j be zeros 
        p1[j,k]=0

    pn=np.linalg.matrix_power(p1,n-2)


    f=p0*pn*p      # this line gives us wrong result. why


    return f
解决方案是使用复制
p
矩阵

p0 = np.copy(p)
p1 = np.copy(p0)
如果您仍然没有得到预期的答案,那么您可能需要查看和


另请注意,作为矩阵乘法运算符引入了
@

一个潜在的问题源:

p0=p[:]
生成
视图
,而不是
副本
。这意味着在这两个循环(可能不需要循环即可写入)之后,
p
p0
p1
具有相同的值

你有没有逐行测试这个代码,确保每个步骤都是正确的?当我用Python编写函数时,尤其是
numpy
以交互方式测试所有步骤

另一件事——除非你真的需要它,否则不要使用
np.matrix
。创建数组时,即使是二维数组,也要坚持使用
np.array
。如果需要矩阵乘法,请使用
np.dot
(或
@

快速重写函数:

def passage(n,i,j):
    p=np.array([[0,1,0,0],[0.5,0,0.5,0],[0,.5,0,.5],[0,0,1,0]])
    p0=p.copy()
    p0[:,j] = 0
    p1=p0.copy()
    p1[j,:] = 0
    pn=np.linalg.matrix_power(p1,n-2)
    f = p0@pn@p    # or p0.dot(pn.dot(p))
    return f

In [15]: passage(4,0,0)
Out[15]: 
array([[ 0.125 ,  0.    ,  0.375 ,  0.    ],
       [ 0.    ,  0.1875,  0.    ,  0.1875],
       [ 0.1875,  0.    ,  0.5625,  0.    ],
       [ 0.    ,  0.375 ,  0.    ,  0.375 ]])

*
不是矩阵积,而是元素积。正确或错误的结果是什么?这个问题很不完整。它需要一个MVC示例,并解释您想要什么。我将代码的结果与分析结果和Mathematica计算进行了比较。@WillemVanOnsem不在
np.matrix
类上,所有
p
p0
pn
都是乘法得到
f
的实例。对于I=j=0和n=4,预期输出为f=[[0.125,0,0.357,0],[0,0.1875,0,0.1875],[0.1875,0,0.5625,0],[0,0.375,0,0.375]@h