Does TensorOperations.jl do what you want?

--Tim

On Sunday, February 22, 2015 12:32:34 AM Viral Shah wrote:
> Best to file an issue.
> 
> -viral
> 
> On Sunday, February 22, 2015 at 12:52:17 PM UTC+5:30, Spencer Lyon wrote:
> > 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