nvector._core.mdot

mdot(a, b)[source]
Returns multiple matrix multiplications of two arrays
i.e. dot(a, b)[i,j,k] = sum(a[i,:,j] * b[:,j,k])
or
np.concatenate([np.dot(a[…,i], b[…,i])[:, :, None]
for i in range(2)], axis=2)

Examples

3 x 3 x 2 times 3 x 3 x 2 array -> 3 x 2 x 2 array

>>> import numpy as np
>>> import nvector as nv
>>> a = 1.0 * np.arange(18).reshape(3,3,2)
>>> b = - a
>>> t = np.concatenate([np.dot(a[...,i], b[...,i])[:, :, None]
...                    for i in range(2)], axis=2)
>>> tt = nv.mdot(a, b)
>>> tt.shape
(3, 3, 2)
>>> np.allclose(t, tt)
True

3 x 3 x 2 times 3 x 1 array -> 3 x 1 x 2 array

>>> t1 = np.concatenate([np.dot(a[...,i], b[:,0,0][:,None])[:,:,None]
...                    for i in range(2)], axis=2)
>>> tt = nv.mdot(a, b[:,0,0].reshape(-1,1))
>>> tt.shape
(3, 1, 2)
>>> np.allclose(t1, tt)
True

3 x 3 times 3 x 3 array -> 3 x 3 array >>> tt0 = nv.mdot(a[…,0], b[…,0]) >>> tt0.shape (3, 3) >>> np.allclose(t[…,0], tt0) True

3 x 3 times 3 x 1 array -> 3 x 1 array >>> tt0 = nv.mdot(a[…,0], b[:,0,0][:,None]) >>> tt0.shape (3, 1) >>> np.allclose(t[:,0,0][:,None], tt0) True

3 x 3 times 3 x 2 array -> 3 x 1 x 2 array >>> tt0 = nv.mdot(a[…, 0], b[:, :2, 0][:, None]) >>> tt0.shape (3, 1, 2) >>> np.allclose(t[:,:2,0][:,None], tt0) True