найти точечный продукт подмассивов в numpy

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


person Ben Kirwin    schedule 09.06.2011    source источник
comment
По какой оси / осям вы хотите сделать продукт? Для случая, когда X и Y оба были 3x3, каков размер Z?   -  person talonmies    schedule 10.06.2011
comment
@talonmies Если два трехмерных массива равны K x L x M и K x M x N, результат должен быть K x L x N.   -  person Ben Kirwin    schedule 11.06.2011


Ответы (1)


Как насчет:

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]) матрица

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

person JoshAdel    schedule 10.06.2011
comment
Как написано, я не думаю, что это работает, если X и Y являются 3D. - person DSM; 10.06.2011
comment
@DSM - да, изначально пропустил это. Теперь у меня есть исправленное решение. - person JoshAdel; 10.06.2011
comment
Исправленная версия выглядит хорошо... спасибо! Извините, если мой первоначальный вопрос не был ясен. - person Ben Kirwin; 11.06.2011
comment
@hass: твой вопрос был понятен, я просто пропустил его, когда читал в первый раз. Рад, что смог быть полезен. - person JoshAdel; 12.06.2011