I am new to python and I need your kindly help.

I have three matrices, in particular:

- Matrix M (class of the matrix: scipy.sparse.csc.csc_matrix), dimensions: N x C;
- Matrix G (class of the matrix: numpy.ndarray), dimensions: C x T;
- Matrix L (class of the matrix: numpy.ndarray), dimensions: T x N.

Where: N = 10000, C = 1000, T = 20.

I would like to calculate, this score:

I tried by using two `for`

loops , one for the `i`

-index and one for `c`

. Furthermore, I used a `dot`

product for obtaining the last sum in the equation. But my implementation requires too much times for giving the result.

This is what I implemented:

score = 0.0 for i in range(N): for c in range(C): Mic = M[i,c] score += np.outer(Mic,(np.dot(L[:,i],G[c,:])))

Is there a way to avoid the two `for`

loops?

Thank you in advance!

Best

## Advertisement

## Answer

Try this `score = np.einsum("ic,ti,ct->", M, L, G)`

**EDIT1**

By the way, in your case, `score = np.sum(np.diag(M @ G @ L))`

(in PYTHON3 starting from version 3.5, you can use the semantics of the `@`

operator for `matmul`

function) is faster than `einsum`

(especially in `np.trace((L @ M) @ G )`

due to efficient use of memory, maybe @hpaulj meant this in his comment). But `einsum`

is easier to use for complex tensor products (to encode with `einsum`

I used your math expression directly without thinking about optimization).

Generally, using `for`

with `numpy`

results in a dramatic slowdown in computation speed (think “vectorize your computations” in the case of `numpy`

).