You could probably also use the shape argument to make things much easier and faster. Something like this:
mu = np.array([
[10, 20],
[100, 2],
[20, 20],
])
sd = np.array([
[0.1, 0.2],
[20, 0.1],
[10, 10],
])
# We observed vector producs with those vectors
vectors = np.random.randn(2, 10) ** 2
observations = np.random.randint(1, 100, size=(3, 10))
with pm.Model() as model:
matrix = pm.Gamma('matrix', mu=mu, sd=sd, shape=mu.shape)
eta = tt.dot(matrix, vectors)
pm.Poisson('y', mu=eta, observed=observations)
About the uniform: It’s not that anything is wrong with a uniform prior per se, but only that it is a prior that beginners often use in places where it isn’t a good choice. It can be tempting to think something like “I guess it is larger than x and probably smaller than y, and I don’t really know what’s going on, so I’ll just use a uniform(x, y)”. In cases like that it’s pretty much always better to use a distribution where the support is the entire set that it could in theory be, but that has a small prob far away from (x,y).
If the support of the parameter really should be (x, y), and values outside are impossible, and if there really is no reason to think that some values are more plausible than others, a uniform is fine.