[英]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.