Hi Rick! On Fri, Sep 3, 2010 at 4:02 AM, Rick Muller <rpmul...@gmail.com> wrote: > Can someone help me replace a slow expression with a faster one based on > tensordot? I've read the documentation and I'm still confused. > > I have two matrices b and d. b is n x m and d is m x m. I want to replace > the expression > >>>> bdb = zeros(n,'d') >>>> for i in xrange(n): >>>> bdb[i,:] = dot(b[i,:],dot(d,b[i,:])
I am first trying to reproduce this --- the above is missing one ")" and also dot() seems to produce a number, but you are assigning it to bdb[i,:], also you declare bdb as a 1D array. So I tried this: http://gist.github.com/568879/ > > with something that doesn't have the for loop and thus is a bit faster. > > The first step is > >>>> bd = dot(b,d) > > However, following this with > >>>> bdb = dot(bd,b.T) > > doesn't work, since it yields a n x n matrix instead of an n x 1 vector. > Reading the notes on tensordot makes me think it's the function to use, but > I'm having trouble grokking the axes argument. Can anyone help? In the above gist, I did the following: bd = dot(b, d) bdb = diag(dot(bd, b.T)) print bdb which printed the same as: for i in xrange(n): bdb[i] = dot(b[i,:], dot(d, b[i, :])) print bdb but I think that this is not what you want, is it? I think you want to do something like: b * d * b.T but since b is a (n, m) matrix, the result is a matrix, not a vector, right? Ondrej _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion