Матрица двумерных и трехмерных матриц "строчная" - PullRequest
0 голосов
/ 10 мая 2019

Я начал изучать numpy, и я пытаюсь сделать что-то вроде странного умножения матриц между 2-мерными и 3-мерными матрицами. У меня есть функция, которая делает то, что мне нужно, но мне любопытно, есть ли лучший способ сделать это.

Давайте рассмотрим матрицу M1 с размерами (KxN) и другую матрицу M2 с размерами (KxNxN). Я пытаюсь умножить каждую (1xN) строки M1 с соответствующей (NxN) матрицей M2. Вот мой код с образцами матриц:

a = [[1., 2., 3.],
     [0., 9., 8.]]
a = np.array(a)
b = [[[.5, .5, .5],
      [.5, .5, .5],
      [.5, .5, .5]],
     [[.25, .25, .25],
      [.25, .25, .25],
      [.25, .25, .25]]]
b = np.array(b)

c = [[5., 5., 5., 5., 5.]]
c = np.array(c)
d = [[[.1, .1, .1, .1, .1],
      [.2, .2, .2, .2, .2],
      [.3, .3, .3, .3, .3],
      [.4, .4, .4, .4, .4],
      [.5, .5, .5, .5, .5]]]
d = np.array(d)


def mul(x, y):
    result = []
    for i in range(len(x)):
        result.append(x[i] @ y[i])
    return np.array(result)


print(mul(a, b))
[[3.   3.   3.  ]
 [4.25 4.25 4.25]]
print(mul(c, d))
[[7.5 7.5 7.5 7.5 7.5]]

Я думаю, это проясняет. Я уверен, что есть лучший способ сделать это, но до сих пор я не смог придумать один. Я пытался с apply_along_axis и умножением, но я мог быть совершенно не в курсе.

1 Ответ

0 голосов
/ 10 мая 2019

Вы можете использовать np.einsum -

np.einsum('ij,ijk->ik',array1,array2)

Или с оператором np.matmul или @ на Python 3.x -

np.matmul(array1[:,None,:],array2)[:,0]
(array1[:,None,:] @ array2)[:,0]
...