# Real inner-product in python

Wed Jan 22 23:11:42 CET 2003

On Wednesday 22 January 2003 01:49, Nadav Horesh wrote:
>  >>> c = N.reshape(N.arange(12), (3,2,2))
>  >>> b = N.arange(3)
>  >>> N.dot(b,c)
>
> Traceback (most recent call last):
>   File "<pyshell#18>", line 1, in ?
>     N.dot(b,c)
>   File "/usr/local/lib/python2.3/site-packages/Numeric/Numeric.py",
> line 335, in dot
>     return multiarray.matrixproduct(a, b)
> ValueError: matrices are not aligned

[snip]

> As I see inner product between two tensors --- A of rank $n$ and B of
> rank $m$ it should be like
> (in TeX style):
> $$> C = A \cdot B >$$
> requires:
>
> 1.  The last dimension of A must be equal to the first dimension of
> B, and ...
> 2.
> $$> C_{p_1, ... p_{m-1},q_2, ... q_n} = \sum_{i=1}^{q_1} A_{p_1, ... > p_{m-1},i} B_{i, q_2, ... q_{n}} >$$
>
> Thus, I don't see the *dot* function as a proper inner product.

Well, in my response I almost discussed tensors, but hedged, since I'm
discipline myself with figuring out all the indexing yet).

But, you may be able to fake it with careful use of transpose(), if I

>>> c
[[[ 0, 1,]
[ 2, 3,]]
[[ 4, 5,]
[ 6, 7,]]
[[ 8, 9,]
[10,11,]]]

>>> d = N.transpose(c)

>>> d
[[[ 0, 4, 8,]
[ 2, 6,10,]]
[[ 1, 5, 9,]
[ 3, 7,11,]]]

>>> d.shape
(2, 2, 3)

>>> b.shape
(3,)

>>> N.dot(d,b)
[[20,26,]
[ 8,12,]]

>>> N.transpose(N.dot(d,b))
[[20, 8,]
[26,12,]]

Other than that, the only thing I can think of is to look at
ScientificPython, which purports to do Tensor operations.

http://starship.python.net/~hinsen/ScientificPython/

Also, you could check out SciPy (CVS) which wraps the BLAS/LAPACK
libraries, and Yorick, which may also do various tensor math functions.

--
Bay Area Python Interest Group - http://www.baypiggies.net/