Search code examples
pythonarraysnumpymultiplication

What is the fastest way to multiply two 2D numpy arrays?


we are supposed to find a way to multiply a 2D array X of size (7403, 33) with its transpose

i mean this X* X.T

The solution is supposed to be 2.5 times faster than the np.dot(X,X.T). i have tried everything i can think of

%timeit np.dot(X,X.T)
%timeit np.matmul(X,X.T)
%timeit X@X.T
%timeit np.einsum("ij, jk -> ik",X,X.T)

and i have only acheived 1.5 times faster than the numpy dot

3.17 s ± 14.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.03 s ± 6.82 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.01 s ± 6.57 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.02 s ± 6.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Solution

  • Well i found the solution with scipy

    %timeit np.dot(X,X.T)
    %timeit np.matmul(X,X.T)
    %timeit X@X.T
    %timeit np.einsum("ij, jk -> ik",X,X.T)
    %timeit linalg.blas.dgemm(alpha=1.0, a=X, b=X.T)
    

    which gives

    3.07 s ± 16.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    2.02 s ± 37.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    1.99 s ± 9.79 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    2 s ± 5.97 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    306 ms ± 6.85 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)