# [Numpy-discussion] Help with the tensordot function?

Ondrej Certik ondrej@certik...
Tue Sep 7 14:23:11 CDT 2010

```Hi Rick!

On Fri, Sep 3, 2010 at 4:02 AM, Rick Muller <rpmuller@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
```