2016-02-02 3 views
2

У меня есть два Numpy массивы, какNumpy матрица умножения 2d матрицы дать 3D матрицу

A: = array([[0, 1], 
      [2, 3], 
      [4, 5]]) 

B = array([[ 6, 7], 
      [ 8, 9], 
      [10, 11]]) 

Для каждой строки А и В, скажем, Ra и Rb соответственно, я хочу, чтобы вычислить транспонирования (Ra) * Rb. Таким образом, для данного значения A и B, я хочу следующий ответ:

array([[[ 0, 0], 
     [ 6, 7]], 

     [[ 16, 18], 
     [ 24, 27]], 

     [[ 40, 44], 
     [ 50, 55]]]) 

Я написал следующий код, чтобы сделать это:

x = np.outer(np.transpose(A[0]), B[0]) 
for i in range(1,len(A)): 
    x = np.append(x,np.outer(np.transpose(A[i]), B[i]),axis=0) 

Есть ли лучший способ сделать эту задачу.

ответ

2

Вы можете использовать расширить размеры A и B с np.newaxis/None принести в broadcasting для векторизованного решения, как так -

A[...,None]*B[:,None,:] 

Объяснение:np.outer(np.transpose(A[i]), B[i]) в основном это поэлементны умножения между версией A[i]столбчатого и B[i]. Вы повторяете это для всех строк в A по сравнению с строками в B. Обратите внимание, что np.transpose() не оказывает никакого влияния, так как np.outer заботится о предполагаемых элементарных умножениях.

Я бы назвал эти шаги в векторизованного языке и таким образом реализовать, например, так -

  1. Extend размеры A и B сформировать 3D формы для обоих из них таким образом, что мы держим axis=0 выровнены и держать как axis=0 в обеих этих расширенных версиях. Таким образом, нам остается решать две последние оси.
  2. Привести в поэлементных умножениях, толчкаaxis=1 А в оригинальной 2D версии для axis=1 в своей версии 3D, создавая тем самым одноплодное измерение в axis=2 для расширенной версии A.
  3. Этот последний одноточечно размер 3D версии A должен совпадать с элементами из axis=1 в оригинальной версии 2DB, чтобы broadcasting случиться. Таким образом, расширенная версия B будет иметь элементы от axis=1 в ее 2D-версии, которая будет нажата до axis=2 в ее версии 3D, тем самым создавая одноэлементный размер для axis=1.

Наконец, расширенные версии будут: A[...,None] & B[:,None,:], умножая которого даст нам желаемый результат.

+0

wow !!! один лайнер ... не могли бы вы объяснить этот ответ. – Shweta

+0

Как я могу сделать подобное для 2-х матриц? – Shweta

+0

@Shweta AFAIK 'theano' также поддерживает« трансляцию », поэтому я думаю, что это должно работать так же, как и для массивов/матриц Anano, не так ли? – Divakar

Смежные вопросы