我想以简洁的形式计算以下两个矩阵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);
答案 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()