найти скалярное произведение подмассивов в numpy - PullRequest
9 голосов
/ 10 июня 2011

В numpy функцию numpy.dot() можно использовать для вычисления матричного произведения двух двумерных массивов. У меня есть два 3D-массива X и Y (скажем), и я хотел бы вычислить матрицу Z, где Z[i] == numpy.dot(X[i], Y[i]) для всех i. Возможно ли это сделать не итеративно?

1 Ответ

8 голосов
/ 10 июня 2011

Как насчет:

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

умножение на два последних измерения

...