Как векторизовать np.dot (vector_a, vector_b [:, i]) для i в диапазоне?

У меня есть массив vector_a формы (3,1). Если я умножу его на vector_b формы (1,3), я получу результат shape (3,3).

Теперь vector_b на самом деле представляет собой (3, N) массив векторов-столбцов. Я хочу умножить каждый из этих векторов-столбцов на vector_a, чтобы получить N матриц 3x3, результат shape (N, 3,3)

Я сделал следующее:

r = np.dot(vector_a.reshape(1,3,1), vector_b.T.reshape(N, 1, 3))

и я ожидал, что r будет иметь форму (N, 3,3), но я получил форму (1,3,64,3) ??? Не знаю, почему у меня такая форма. И vector_a, и vector_b являются смежными. Я попытался преобразовать vector_b в F смежный, прежде чем делать vector_b.T.reshape(N, 1, 3), но я все еще получаю ту же форму r (1,3,64,3).

Кто-нибудь знает, как написать правильное выражение?


person martinako    schedule 07.12.2015    source источник
comment
Что dot говорит о массивах, размер которых превышает 2d?   -  person hpaulj    schedule 07.12.2015
comment
Спасибо, я этого не читал. Но я все еще не могу заставить его работать ...   -  person martinako    schedule 07.12.2015
comment
Это действительно не dot случай. Выражение einsum ничего не суммирует. Это можно сделать с помощью простого умножения (и широковещательной передачи) b.T[:,:,None] * a.T[None,:,:].   -  person hpaulj    schedule 07.12.2015


Ответы (2)


В качестве альтернативного решения, если вы используете einsum, вы можно избежать изменения формы массива для скалярного произведения:

np.einsum('ij,jk->kij', vector_a, vector_b)
person Alex Riley    schedule 07.12.2015
comment
Мне все еще нужно полностью понять einsum, но это работает! Благодарность - person martinako; 07.12.2015
comment
Без проблем! einsum невероятно полезен - есть различные ответы, объясняющие это здесь (включая тот, который я написал ;-)). - person Alex Riley; 07.12.2015

Здесь используется broadcasting и _ 2_ -

vector_b.T[:,None,:]*vector_a
person Divakar    schedule 07.12.2015