Hello,

I have a vectorizing problem that I don't see an obvious way to solve. What I have is a vector like:

obs=array([1,2,3,4,3,2,1,2,1,2,1,5,4,3,2])

and a matrix

T=zeros((6,6))

and what I want in T is a count of all of the transitions in obs, e.g. T[1,2]=3 because the sequence 1-2 happens 3 times, T[3,4]=1 because the sequence 3-4 only happens once, etc... I can do it unvectorized like:

for o1,o2 in zip(obs[:-1],obs[1:]):
    T[o1,o2]+=1


which gives the correct answer from above, which is:

array([[ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  3.,  0.,  0.,  1.],
       [ 0.,  3.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  2.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  2.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.]])



but I thought there would be a better way.  I tried:

o1=obs[:-1]
o2=obs[1:]
T[o1,o2]+=1

but this doesn't give a count, it just yields 1's at the transition points, like:

array([[ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.]])


Is there a clever way to do this? I could write a quick Cython solution, but I wanted to keep this as an all-numpy implementation if I can.


                        thanks,


                                Brian Blais



--
Brian Blais
bbl...@bryant.edu
http://web.bryant.edu/~bblais



_______________________________________________
Numpy-discussion mailing list
Numpy-discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to