умножение двумерной матрицы - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть три матовые матрицы x, r и r. Чьи значения:

x = np.array([[4,2],
              [0,-1],
              [-2,5],
              [2,6]])

y = np.array([[1,7],
              [2,6],
              [5,2]])

r = np.array([[2,2,1],
              [2,3,1],
              [9,5,1],
              [2,0,4]])

Что я собираюсь сделать, это: (трудно описать словами, поэтому я использую код для представления того, что я хочу сделать)

K = r.shape[1]
D = x.shape[1]

v = np.zeros((K, D, D))
for k in range(K):
    v[k] = (r[:, k] * (x - y[k]).transpose() @ (x - y[k]))
print(v)

Последний v - это то, что мне нужно, и v равно

[[[103.  38.]
  [ 38. 216.]]

 [[100.  46.]
  [ 46. 184.]]

 [[111. -54.]
  [-54.  82.]]]

Есть ли какой-нибудь элегантный или pythonic способ достичь этого без петель?

Спасибо

1 Ответ

0 голосов
/ 03 ноября 2018

Это должно работать для вас:

A = x[np.newaxis,...]-y[:,np.newaxis,:] # equivalent to (x-y[k]) for all k 
B = A.swapaxes(1,2) # equivalent to (x-y[k]).transpose() for all k 
C = r.T[:,np.newaxis,:]*B # equivalent to r[:, k] * (x - y[k]).transpose()
D = C@A # equivalent to r[:, k] *(x - y[k]).transpose() @ (x - y[k])

Или в нечитаемом виде монстра

((r.T[:,np.newaxis,:]*(x[np.newaxis,...]
                       -y[:,np.newaxis,:]).swapaxes(1,2))@
                                         (x[np.newaxis,...]-y[:,np.newaxis,:]))

доказательство:

>>> (v==((r.T[:,np.newaxis,:]*(x[np.newaxis,...]
                   -y[:,np.newaxis,:]).swapaxes(1,2))@
                                     (x[np.newaxis,...]-y[:,np.newaxis,:]))).all()
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...