简化了涉及矩阵的方程的实现

时间:2017-01-10 23:25:45

标签: python numpy matrix

我想以简洁的形式计算以下两个矩阵P和Q,这样我可以在一次镜头中计算矩阵,而不是遍历所有索引。

enter image description here

可以建议我在python中计算这些矩阵P和Q的有效方法是什么?我附加了我的实现代码。我想避免在索引i和j上循环,而是在单个表达式中计算P.

import numpy as np

def sum_matrices(i,j):
      a=0;
      for m in range(M+1):
            a+= p[m]*W[m][i]*np.dot(A[m][j][:],x);
return a;

for i in range(N):
     for j in range(N):
          P[i][j]=sum_matrices(i,j);

1 个答案:

答案 0 :(得分:2)

所以numpy条款

W - (M,N) shape, dtype float
A - (M,N,N)
x - (N,)
p - (M,)

将你的方程式,动态地转换为爱因斯坦符号,然后转换为np.einsum,我认为你想要:

Ax = np.einsum('mjk,k->mj', A, x)    # sums on k
P = np.einsum('m,mi,mj->ij', p, W, Ax)   # sums on m
pW = np.einsum('m,mi->i', p, W)      # sums on m
Q = np.einsum('m,i,mj->ij', p, pW, Ax)   # sums on m

显然,需要使用小M和N以及样本数组进行测试。我也没有尝试深入理解方程;我主要关注索引表示法。

===============

我将你的代码修改为:

def sum_matrices(i,j):
      a=0;
      for m in range(M):
            a+= p[m]*W[m, i]*np.dot(A[m,j],x);
      return a;

def sum_matrices(i, j):
      Ax = np.array([np.dot(A[m,j,:], x) for m in range(M)])
      a = p * W[:, i] * Ax
      return a.sum()

另见Multiple matrix multiplication