Inserting values into a tensor

Hi,

I would like to add values into a tensor which should be of dimension for e.g (3,2,3) . If I want to add values in that tensor how can I do it.
I have :

for a_person in range(1):
        for b_person in range(1):
            z_aTb[a_person,b_person] = pm.Categorical('ax_%dT%d' %(a_person,b_person),p = pi_list[a_person], shape =(1,K)) 

Instead of using for loop I want to rewrite it in such a way that the computation time improves. The dimension I gave as example is for z_aTb.

Help much appreciated.
Thanks

Dealing with shape in Categorical is quite tricky. I suggest you to create a RV with the shape (3*2*3), with a p=(3*2*3, k), then reshape it into the shape you want.

If I do so won’t the resulting tensor be of shape(3,2,3).

Ops the post was rendered different than I expected, see edited post above.

For p I can’t just simply use p=(3*2*3, k) because p has to be from pi_list where

 pi_list = np.empty(people,dtype=object)
    for user in range(people):
        user_pi = pm.Dirichlet('userx_pi_%d' % user, a=alpha, shape = (1,K))
        pi_list[user] = user_pi

So I tried something like this :

alpha = np.ones((K*people))    
pi_list = pm.Dirichlet('userx_pi', a=alpha, shape = (K*people))
pi_list = tt.reshape(pi_list,(people,K))

I dont think that’s right, you should do:

alpha = np.ones((K)) 
pi_list = pm.Dirichlet('userx_pi', a=alpha, shape = (people, K))

What exactly should be the dimensions of p in case of Categorical?
Because if I use z_aTb = pm.Categorical('a_' ,p = pi_list, shape =(people*K*people)) with p as pi_list then its shape is people, K whereas shape is way bigger.

in the case of Categorical, if the p is shape (n, k) with k being the number of categories, the output random variable has the shape (n, 1).

I would like to multiply z_aTb with z_aTb.T . and reshape it into 1,people*people . I think I’m doing some silly mistake here. B = np.eye(K)*0.8

    z_aTb = pm.Categorical('a_' ,p = pi_list, shape =(people*K,people))
     
    bernoulli_params = tt.dot(tt.dot(z_aTb,B),z_aTb.T) 
            
    bernoulli_params = tt.reshape(bernoulli_params,(1,people*people)) 

Is there any way I can use theano dot and multiply tt.dot(tt.dot(z_aTb,B),z_aTb.T) ? Because there will be dimension error this way!

@junpenglao For e.g I have tensors with shape as (20,3,20) (3,3) (20,3,20) . Multiplying these I would like to get output result shape as (400,) . How can I achieve it?

You can try tensordot from theano