Как насчет:
from numpy.core.umath_tests import inner1d
Z = inner1d(X,Y)
Например:
X = np.random.normal(size=(10,5))
Y = np.random.normal(size=(10,5))
Z1 = inner1d(X,Y)
Z2 = [np.dot(X[k],Y[k]) for k in range(10)]
print np.allclose(Z1,Z2)
возвращает True
Редактировать Исправление, поскольку я не видел трехмерную часть вопроса
from numpy.core.umath_tests import matrix_multiply
X = np.random.normal(size=(10,5,3))
Y = np.random.normal(size=(10,3,5))
Z1 = matrix_multiply(X,Y)
Z2 = np.array([np.dot(X[k],Y[k]) for k in range(10)])
np.allclose(Z1,Z2) # <== returns True
Это работает, потому что (как указано в строке документации), matrix_multiply
обеспечивает
matrix_multiply (x1, x2 [, out]) matrix
умножение на два последних измерения