Bump on this thread. I need this functionality again...

On Friday, December 6, 2013 at 11:04:44 AM UTC-5, Spencer Lyon wrote:
>
> I am working with tensors with more than 2 dimensions. I would like to 
> find a Julia equivalent to the numpy function tensordot. The docstring 
> for the function explains its use well, so I will just copy/paste it here:
>
> def tensordot(a, b, axes=2):
>     """
>     Compute tensor dot product along specified axes for arrays >= 1-D.
>
>     Given two tensors (arrays of dimension greater than or equal to one),
>     ``a`` and ``b``, and an array_like object containing two array_like
>     objects, ``(a_axes, b_axes)``, sum the products of ``a``'s and ``b``'s
>     elements (components) over the axes specified by ``a_axes`` and
>     ``b_axes``. The third argument can be a single non-negative
>     integer_like scalar, ``N``; if it is such, then the last ``N``
>     dimensions of ``a`` and the first ``N`` dimensions of ``b`` are summed
>     over.
>
>     Parameters
>     ----------
>     a, b : array_like, len(shape) >= 1
>         Tensors to "dot".
>
>     axes : variable type
>
>     * integer_like scalar
>       Number of axes to sum over (applies to both arrays); or
>
>     * array_like, shape = (2,), both elements array_like
>       Axes to be summed over, first sequence applying to ``a``, second
>       to ``b``.
>
>     See Also
>     --------
>     dot, einsum
>
>     Notes
>     -----
>     When there is more than one axis to sum over - and they are not the last
>     (first) axes of ``a`` (``b``) - the argument ``axes`` should consist of
>     two sequences of the same length, with the first axis to sum over given
>     first in both sequences, the second axis second, and so forth.
>
>     Examples
>     --------
>     A "traditional" example:
>
>     >>> a = np.arange(60.).reshape(3,4,5)
>     >>> b = np.arange(24.).reshape(4,3,2)
>     >>> c = np.tensordot(a,b, axes=([1,0],[0,1]))
>     >>> c.shape
>     (5, 2)
>     >>> c
>     array([[ 4400.,  4730.],
>            [ 4532.,  4874.],
>            [ 4664.,  5018.],
>            [ 4796.,  5162.],
>            [ 4928.,  5306.]])
>     >>> # A slower but equivalent way of computing the same...
>     >>> d = np.zeros((5,2))
>     >>> for i in range(5):
>     ...   for j in range(2):
>     ...     for k in range(3):
>     ...       for n in range(4):
>     ...         d[i,j] += a[k,n,i] * b[n,k,j]
>     >>> c == d
>     array([[ True,  True],
>            [ True,  True],
>            [ True,  True],
>            [ True,  True],
>            [ True,  True]], dtype=bool)
>     """
>
> I think the functionality laid out in the explicit for loops would be 
> quite easy to replicate using the @nloops and @nref macros in Cartesian, 
> but I am not sure if that will be most performant way to implement such a 
> function. Also, I wanted to check here to see if this has already been done 
> before I spend some time working on this.
>
> Thanks,
>

Reply via email to