Real inner-product in python
Chad Netzer
cnetzer at mail.arc.nasa.gov
Wed Jan 22 23:11:42 CET 2003
On Wednesday 22 January 2003 01:49, Nadav Horesh wrote:
> Whats about:
> >>> 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
not all that comfortable with thinking about them (haven't had to
discipline myself with figuring out all the indexing yet).
But, you may be able to fake it with careful use of transpose(), if I
understand your meaning...
Continuing your example:
>>> 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/
Chad Netzer
More information about the Python-list
mailing list