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
).