Как сделать поэлементное умножение матриц с использованием NumPy - PullRequest
0 голосов
/ 31 января 2019

У меня есть два массива, размером a (20 * 3 * 3) и размером b (3 * 3).Пусть a = (a1, a2, ..., a20).Я хочу вычислить матричный элемент произведения следующим образом: c = (c1, c2, ..., c20), ci = bT ai b, i = 1 ~ 20.Как я могу сделать это эффективно, используя NumPy?

Медленная версия, использующая цикл for, выглядит следующим образом:

a = np.random.sample((20, 3, 3))
b = np.random.sample((3, 3))
c = np.zeros_like(a)
for i0, ai in enumerate(a):
    c[i0] = np.dot(b.T, np.dot(ai, b))

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете попробовать np.matmul(b.T, np.dot(a,b)):

import numpy as np
import pandas as pd

a = np.random.sample((4, 3, 3))
b = np.random.sample((3, 3))
c = np.zeros_like(a)

# using for loop
for i0, ai in enumerate(a):
    c[i0] = np.dot(b.T, np.dot(ai, b))

# alternative method
e = np.zeros_like(a)
e = np.matmul(b.T, np.dot(a,b))

# checking for equal
print(np.array_equal(c, e))
0 голосов
/ 31 января 2019

Вы можете просто поместить свою операцию в векторизованную форму, потому что ваши входные данные являются массивами NumPy.Нет необходимости в явном цикле for и индексации.

PS: Спасибо @yatu, который обнаружил, что ответ не имеет ту же форму.Теперь я добавил swapaxes, чтобы получить последовательный ответ в качестве подхода ОП

np.random.seed(1)

a = np.random.sample((4, 3, 3))
b = np.random.sample((3, 3))

c = np.dot(b.T, np.dot(a, b)).swapaxes(0,1)
print (c)

[[[0.96496962 1.30807122 0.55382266]
  [1.42300972 1.98975139 0.81871374]
  [0.32358338 0.45493059 0.1346777 ]]

 [[1.46772447 2.15650254 0.87555186]
  [2.26335921 3.33689922 1.28679305]
  [0.71561413 0.96507585 0.54309736]]

 [[1.50660527 2.36946435 0.59771395]
  [2.49705244 3.76328176 1.06274954]
  [0.96090846 1.43636151 0.31807679]]

 [[1.03706878 1.94107476 0.61884642]
  [1.74739926 3.07419808 1.03537019]
  [0.59565039 1.09721382 0.37283626]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...