What is the best way to compute the trace of a matrix product in numpy?

前端 未结 3 796
甜味超标
甜味超标 2020-12-29 07:40

If I have numpy arrays A and B, then I can compute the trace of their matrix product with:

tr = numpy.linalg.trace(A.dot(B))
         


        
3条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-29 08:02

    You can improve on @Bill's solution by reducing intermediate storage to the diagonal elements only:

    from numpy.core.umath_tests import inner1d
    
    m, n = 1000, 500
    
    a = np.random.rand(m, n)
    b = np.random.rand(n, m)
    
    # They all should give the same result
    print np.trace(a.dot(b))
    print np.sum(a*b.T)
    print np.sum(inner1d(a, b.T))
    
    %timeit np.trace(a.dot(b))
    10 loops, best of 3: 34.7 ms per loop
    
    %timeit np.sum(a*b.T)
    100 loops, best of 3: 4.85 ms per loop
    
    %timeit np.sum(inner1d(a, b.T))
    1000 loops, best of 3: 1.83 ms per loop
    

    Another option is to use np.einsum and have no explicit intermediate storage at all:

    # Will print the same as the others:
    print np.einsum('ij,ji->', a, b)
    

    On my system it runs slightly slower than using inner1d, but it may not hold for all systems, see this question:

    %timeit np.einsum('ij,ji->', a, b)
    100 loops, best of 3: 1.91 ms per loop
    

提交回复
热议问题