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

Ondrej Certik ondrej@certik...
Tue Sep 7 15:09:32 CDT 2010

```On Tue, Sep 7, 2010 at 12:23 PM, Ondrej Certik <ondrej@certik.cz> wrote:
> 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?

Ah, I just noticed you got this resolved in the other thread.

Ondrej
```