[Numpy-discussion] Help with the tensordot function?
Ondrej Certik
ondrej at certik.cz
Tue Sep 7 15:23:11 EDT 2010
Hi Rick!
On Fri, Sep 3, 2010 at 4:02 AM, Rick Muller <rpmuller at 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
More information about the NumPy-Discussion
mailing list