注意:我有使用慢速Python for循环的工作代码,并且正在尝试使其变得更加麻木。
我在numpy中有一个2D数组; Stochastic Matrix,过渡矩阵,过渡概率矩阵或马尔可夫矩阵。
随机矩阵:第i
行包含转换为状态j
的概率。仅此而已。请注意,行始终加为1,列不需要加。
在下面的示例中,状态0
有0.5
机会转换到状态0
(自身)和1
中的每个状态。
我想使国家崩溃,以“粗粮”。因此,例如,状态0
和1
应该将其概率组合在一起,这样就可以将它们视为一个状态。
tpm = np.array([
[0.3, 0.7, 0],
[0.3, 0.7, 0],
[0, 0, 1],
])
g = np.array([0,0,1])
>>> coarse_grain(tpm, g)
[[1. 0.]
[0. 1.]]
我已经提出了,但是很慢:
def coarse_grain_old(tpm, tpm_group): # slow
group_ixs = [np.argwhere(tpm_group == i).flatten() for i in np.unique(tpm_group)]
n = len(group_ixs)
ntpm = np.zeros((n,n))
group_ixs = [np.argwhere(tpm_group == i).flatten() for i in np.unique(tpm_group)]
n = len(group_ixs)
for nix, ixs in enumerate(group_ixs):
for njx, jxs in enumerate(group_ixs):
nijx = np.ix_(ixs, jxs)
ntpm[nix, njx] = np.mean(np.sum(tpm[nijx], axis=1))
return ntpm
我敢肯定,有比我更容易采取的方法,也许是围绕该主题进行的大量研究,更不用说我的numpy-fu仍在挣扎了关于如何在正方形矩阵中粗化晶粒/塌陷状态的任何想法这个吗?