If I understood A
and B
correctly, then I do not understand the for
loops and why you are not just multiplying by the two non-zero vectors:
# say A & B are like this:
n, N = 3, 5
A = np.array( np.random.randn(N, N ) )
B = np.zeros_like( A )
B[ n ] = np.random.randn( N )
B[:, n] = np.random.randn( N )
take the non-zero row and column of B:
rowb, colb = B[n,:], np.copy( B[:,n] )
colb[ n ] = 0
multiply A
by those two vector:
X = np.outer( A[:,n], rowb )
X[:,n] += np.dot( A, colb )
to verify check:
X - np.dot( A, B )
with N=100
:
%timeit np.dot(A, B)
1000 loops, best of 3: 1.39 ms per loop
%timeit colb = np.copy( B[:,n] ); colb[ n ] = 0; X = np.outer( A[:,n], B[n,:] ); X[:,n] += np.dot( A, colb )
10000 loops, best of 3: 98.5 µs per loop