【问题标题】:Coefficient matrix and loops challenge系数矩阵和循环挑战
【发布时间】:2021-12-12 07:40:13
【问题描述】:

我正在尝试求解 T(p,q) 的方程,如附图中所示。

地点:

  • p = 0.60
  • q = 0.45
  • M - 3行6列的系数矩阵

我创建了五个矩阵并将它们放在各自的函数中,以便稍后在 while 循环中调用它们。但是,循环不会循环遍历 i 的各种值。

我怎样才能使循环工作,或者有其他/更好的方法可以解决以下等式吗?

(仅供参考,这大约是我使用 Python 和编码的第三天)

import numpy as np

def M1(i):
    M = np.array([[1,3,0,4,0,0],[3,3,1,4,0,0],[4,4,0,3,1,0]])
    return M[i-1,0]

def M2(i):
    M = np.array([[1,3,0,4,0,0],[3,3,1,4,0,0],[4,4,0,3,1,0]])
    return M[i-1,1]

def M3(i):
    M = np.array([[1,3,0,4,0,0],[3,3,1,4,0,0],[4,4,0,3,1,0]])
    return M[i-1,2]

def M4(i):
    M = np.array([[1,3,0,4,0,0],[3,3,1,4,0,0],[4,4,0,3,1,0]])
    return M[i-1,3]

def M5(i):
    M = np.array([[1,3,0,4,0,0],[3,3,1,4,0,0],[4,4,0,3,1,0]])
    return M[i-1,4]

def T(p,q):
    sum_i = 0
    i = 1
    while i <=5:
        sum_i = sum_i + ((M1(i)*p**M2(i))*((1-p)**M3(i))*(q**M4(i))*((1-q)**M5(i)))
        i = i +1
        return sum_i

print(T(0.6,0.45))

"""I printed the below equation (using a single value for i) to test if the above loop is working and since I get the same answer as the loop, I can see that the loop is not cycling through the various values of i as expected"""

i=1
p=0.6
q=0.45
print(((M1(i)*p**M2(i))*((1-p)**M3(i))*(q**M4(i))*((1-q)**M5(i))))

【问题讨论】:

  • 对不起,我很迂腐,但在我看来,您并没有“解决”一个方程。您正在“计算”或“计算”一个表达式。
  • 我是来学习的,感谢您指出这一点。

标签: python arrays loops matrix equation


【解决方案1】:

return是放在while循环里面的,需要稍微修改一下代码

    while i <=5:
        sum_i = sum_i + ((M1(i)*p**M2(i))*((1-p)**M3(i))*(q**M4(i))*((1-q)**M5(i)))
        i = i +1
    return sum_i

【讨论】:

  • 非常感谢您的快速回复。成功了!
【解决方案2】:

numpy 的真正强大之处在于查看此类计算,并尝试了解什么是可重复的以及它们具有什么结构。一旦找到相似或并行的操作,请尝试设置您的 numpy 函数调用,以便它们可以在一次调用中并行完成。

例如,在 sum 的典型元素中,有四件事被明确地提升到幂(如果考虑 M(i, 1)^1,则为五分之一)。在一次函数调用中,如果您巧妙地排列数组,则可以在一次函数调用中并行执行所有这四种幂运算:

M = np.array([[1,3,0,4,0,0],[3,3,1,4,0,0],[4,4,0,3,1,0]])
ps_and_qs = np.array([[p, (1-p), q, (1-q)]])

a = np.power(ps_and_qs, M[:,1:5])

现在a 将填充一个包含所有指数的 3 x 4 矩阵。

现在下一步是如何减少这些。 numpy 中内置了几个归约函数,它们在可能的情况下使用矢量化循环有效地实现。它们可以大大加快您的代码速度。特别是,product 减少和sum 减少。使用您的等式,我们需要先将各行相乘以得到每行一个数字,然后在其余列中求和,如下所示:

b = M[:,:1] * np.product(a,axis=1)
c = np.sum(b, axis=0)

c 现在应该是一个等于T 的标量,在(p,q) 处求值。第三天要考虑很多事情,但是如果您继续使用 numpy 对需要更好性能的大型项目进行数值分析,则需要考虑一些事情。

【讨论】:

  • 哇,感谢您花时间解释一种更简单的方法来得出答案。经过几个小时、几个教程和几个令人头疼的问题,我能够理解您的代码的含义,并且在将其应用于我的问题之后,可以看到它的效率是多么令人难以置信。但是,需要注意的一件事是,我确定我必须稍微更改您的代码,以便 b = M[:,:1] * np.product(a,axis=1,keepdims=True)keepdims=True 需要在最终求和之前将b 的输出保留为一列。