# Similar thing to numpy's einsum in Julia

**URL:** <https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932>\
**Category:** New to Julia\
**Tags:** arrays, tensors\
**Created:** [September 16, 2023, 5:33pm UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932 "2023-09-16T17:33:07Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![jisutich](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jisutich/32/33342_2.png) [@jisutich](https://discourse.julialang.org/u/jisutich)\
**Post date:** [September 16, 2023, 5:33pm UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932/1 "2023-09-16T17:33:07Z")

</div>

Hi,

I am thinking about how to achieve something similar to numpy.einsum in Julia. For instance, if I have a tensor T\_{ijk} and a matrix u\_{jj'}, I want to get T'\_{ijk}= u\_{jj'}T\_{ij'k}. Also, I want to do things like H\_i =\sum\_{j}T\_{ijj}. How to efficiently do this in Julia? I noticed that there is a package `Einsum.jl`, is this the best choise? Thanks

---

<div class="post-metadata">

**Author:** ![jar1](https://avatars.discourse-cdn.com/v4/letter/j/c0e974/32.png) [@jar1](https://discourse.julialang.org/u/jar1)\
**Post date:** [September 16, 2023, 6:03pm UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932/2 "2023-09-16T18:03:56Z")

</div>

I like Tullio

> **[GitHub - mcabbott/Tullio.jl: ⅀](https://github.com/mcabbott/Tullio.jl)**
>
> ⅀. Contribute to mcabbott/Tullio.jl development by creating an account on GitHub.

---

<div class="post-metadata">

**Author:** ![jisutich](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jisutich/32/33342_2.png) [@jisutich](https://discourse.julialang.org/u/jisutich)\
**Post date:** [September 16, 2023, 7:20pm UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932/3 "2023-09-16T19:20:17Z")

</div>

This looks good. Thanks

---

<div class="post-metadata">

**Author:** ![mcabbott](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mcabbott/32/6603_2.png) [@mcabbott](https://discourse.julialang.org/u/mcabbott)\
**Post date:** [September 16, 2023, 10:32pm UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932/4 "2023-09-16T22:32:53Z")

</div>

Maybe [TensorOperations.jl](https://github.com/Jutho/TensorOperations.jl) and [OMEinsum.jl](https://github.com/under-Peter/OMEinsum.jl) also deserve mention, these are the closest to np.einsum, – they translate into a sequence of permutation and multiplication operations. Whereas Tullio.jl, like Einsum.jl, writes a set of loops from scratch.

They all share the same notation, e.g. `@tensor T2[i,j,k] := u[j,j2] * T[i,j2,k]` and `@tullio H[i] := T[i,j,j]`.

---

<div class="post-metadata">

**Author:** ![jisutich](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jisutich/32/33342_2.png) [@jisutich](https://discourse.julialang.org/u/jisutich)\
**Post date:** [September 17, 2023, 2:15am UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932/5 "2023-09-17T02:15:37Z")

</div>

Hi Michael, I have a question about `Tullio`. Suppose I want to contract some indexes of a tensor `T`, it seems that `@tullio T[i,j] = T[i,j,k,k]` is not allowed. Is there a way to change `T` without creating another array to store the calculated result?

---

<div class="post-metadata">

**Author:** ![mcabbott](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mcabbott/32/6603_2.png) [@mcabbott](https://discourse.julialang.org/u/mcabbott)\
**Post date:** [September 17, 2023, 2:28am UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932/6 "2023-09-17T02:28:08Z")

</div>

The output needs to be smaller than the input. I suppose you could try writing into a view of the same array, `T2 = view(T, :,:,1,1)` should be the right size. But this seems delicate and I don’t really recommend it. Some views like this will lead to data races & hard to find bugs.

---

<div class="post-metadata">

**Author:** ![jisutich](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jisutich/32/33342_2.png) [@jisutich](https://discourse.julialang.org/u/jisutich)\
**Post date:** [September 17, 2023, 2:30am UTC](https://discourse.julialang.org/t/similar-thing-to-numpys-einsum-in-julia/103932/7 "2023-09-17T02:30:11Z")

</div>

Got it. Thanks.
