2016-06-10 4 views
2

Предположим, что у меня есть ndarray, W формы (m, n, n) и вектор C размерности (m, n). Мне нужно умножить эти два следующим образомФункция умножения матричной 3d-матрицы

result = np.empty(m,n) 
for i in range(m): 
    result[i] = W[i] @ C[i] 

Как это сделать в векторизованном пути без петель и все?

ответ

1

С, вам нужно держать первую ось от обоих W и C выровненный, в то время как потери последней оси из них с матрицей-умножения, я бы предлагают использовать np.einsum для очень эффективного подхода, как так -

np.einsum('ijk,ik->ij',W,C)

np.tensordot или np.dot не имеет функции для выравнивания осей, и здесь улучшается np.einsum.

0

Это делается с помощью np.tensordot

ans=np.tensordot(W,C,axes=[2,1])[np.arange(m),:,np.arange(m)] 
assert np.all(result==ans)