Python 矩阵方程的简化实现

Python 矩阵方程的简化实现,python,numpy,matrix,Python,Numpy,Matrix,我想以简洁的形式计算以下两个矩阵p和Q,这样我就不用循环所有的索引,而是可以在一次快照中计算矩阵 有人能告诉我用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

我想以简洁的形式计算以下两个矩阵p和Q,这样我就不用循环所有的索引,而是可以在一次快照中计算矩阵

有人能告诉我用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);
所以用numpy的话来说

在飞行中,将你的方程转换为爱因斯坦符号,然后转换为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()

另请参见

numpy支持整个矩阵计算您的意思是通过循环i和j并使用上述公式计算$p$的每个元素?请显示您希望改进的当前实现,我想我会更容易理解你需要做什么,在代码中看到它,然后在数学中看到它。@Tadhgmandald Jensen:是的。@Tadhgmandald Jensen:为什么被否决并搁置?我添加了代码,并解释了我的方法和问题。是否存在可以消除I和j的for循环?我必须多次计算这些矩阵P和Q。所以我觉得运行两个for循环会非常慢。einsum表单不会循环。我的错。因此,上述答案实际上是针对同一问题的三种不同解决方案,对吗?其中两个涉及回路,一个不涉及任何回路。与上述循环方法相比,einsum通常是慢还是快?einsum表达式是我的主要答案。其余部分是改进代码的不完整尝试。
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()