繁体   English   中英

Numpy:用索引向量化数学公式

[英]Numpy: Vectorize mathematical formula with indices

我正在使用以下等式模拟马尔可夫生死过程:(抱歉,MathJax 不可用)。

$ b_i = \textbf{P}(X_{n+1} = i +1 | X_n = i)$

$ d_i = \textbf{P}(X_{n+1} = i -1 | X_n = i)$

$\pi_i b_i = \pi_{i+1} d_{i+1}$

$\pi_i = \pi_0 \frac{b_0 b_1 b_2 \dots b_{i-1}}{d_1 d_2 \dots d_i},$ $i = 1, \dots , m$

$\sum \pi_i = 1$

我使用此代码来计算 pi_i:

import numpy as np

m = 10
# b_0 = 0.5, b_1, ..., b_{m-1} = 0.25
b = 0.25 * np.ones(m-1)
b[0] = 0.5

# d1, ..., d_{m-1} = 0.25, d_m = 0.5
d = 0.25 * np.ones(m-1) # d[0] corresponds to d_1 
d[-1] = 0.5

pi = np.ones(m)

for i in range(1, len(pi)):
    #print(f'i={i}, b[0:i] = {b[0:i]}, d[0:i] =  {d[0:i]}')
    pi[i] = pi[0] * np.prod(b[0:i]) / np.prod(d[0:i])

pi_normalized = pi / pi.sum()
print(pi_normalized)

我有兴趣对这个 for 循环进行矢量化:

for i in range(1, len(pi)):
    #print(f'i={i}, b[0:i] = {b[0:i]}, d[0:i] =  {d[0:i]}')
    pi[i] = pi[0] * np.prod(b[0:i]) / np.prod(d[0:i])

问题 1:如何“向量化”上面的 for 循环? “矢量化”是指不使用numpy.vectorize 相反,我想通过使用数组操作来加速代码,比如 c_i = a_i b_i --> c = a * b 其中 a,b 和 c 是 ZA3CBC3F9D0CE2F2C155CZD71D716

问题 2:是否有一种通用的方法/算法可以用索引“矢量化”数学公式?

您可以为此使用 cumprod,这里是 sudo 代码,它可能有效

result = pi[0] * np.cumprod(b) / np.cumprod(d)

我认为问题 2 很模糊,这取决于您拥有的数学公式的类型。 通常,要对涉及索引的数学运算进行矢量化,您可以使用 np.cumsum、np.cumprod、np.arange 等函数,具体取决于可应用于整个数组的运算。 您可以在此处的广播和矢量化部分下了解如何使用矢量化和广播(矢量化的重要部分)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM