我有一部分维特比算法,我想操纵它。我需要理解这段代码中的切片部分:
import numpy as np
A = np.array([[0.6, 0.2, 0.2], [0.5, 0.3, 0.2], [0.4, 0.1, 0.5]])
pi = np.array([0.5, 0.2, 0.3])
O = np.array([[0.7, 0.1, 0.2], [0.1, 0.6, 0.3], [0.3, 0.3, 0.4]])
states = UP, DOWN, UNCHANGED = 0, 1, 2
observations = [UP, UP, DOWN]
alpha = np.zeros((len(observations), len(states))) # time steps x states
alpha[:,:] = float('-inf')
backpointers = np.zeros((len(observations), len(states)), 'int')
***alpha[0, :] = pi * O[:,UP]***
在最后一行打印出O [:,UP]应该给我什么: [0.7,0.1,0.2]我相信 相反,它给了我:
O[:,UP]
Out[15]: array([ 0.7, 0.1, 0.3])
我试着调查这个Understanding Python's slice notation 我无法理解为什么它会改变数组的最后一个元素。
另外,我运行这个:
O[:,UNCHANGED]
Out[17]: array([ 0.2, 0.3, 0.4])
我仍然是python中的新手,我需要一些帮助
答案 0 :(得分:1)
您正在混合列和行的表示法。
您打印O[:,UP]
,它会为您提供所有行,而只是#34; UP"列(索引0)。
您的O
是:
array([[ 0.7, 0.1, 0.2],
[ 0.1, 0.6, 0.3],
[ 0.3, 0.3, 0.4]])
O[:,0]
是
#↓ this column
array([[ 0.7, 0.1, 0.2],
[ 0.1, 0.6, 0.3],
[ 0.3, 0.3, 0.4]])
其中O[0,:]
将是
array([[ 0.7, 0.1, 0.2], #This row
[ 0.1, 0.6, 0.3],
[ 0.3, 0.3, 0.4]])
为了使最后一部分清晰明了,O[:,UNCHANGED]
是O[:,2]
,就在这里:
#↓ this column
array([[ 0.7, 0.1, 0.2],
[ 0.1, 0.6, 0.3],
[ 0.3, 0.3, 0.4]])