0

我正在尝试使用 NumPy 对循环进行矢量化,但我被卡住了我有一个A形状矩阵(NN,NN)我定义了 A-dot 乘积

def scalA(u,v):
    return v.T @ A @ u

然后我有两个矩阵BC(B有一个形状(N,NN)并且C有一个形状(K,NN)我要矢量化的循环是

res = np.zeros((N,K))
for n in range(N):
    for k in range(K):
        res[n,k] = scalA(B[n,:], C[k,:])

我在研究过程中发现了np.tensordotor之类的函数np.einsum,但我并没有真正理解它们是如何工作的,并且(如果我很好理解的话)tensordot将计算规范的点积(A = np.eye(NN)在我的情况下对应)。

谢谢 !

4

2 回答 2

0

可能你正在寻找这个:

def scalA(u,v):
    return u @ A @ v.T

如果 shape of Ais (NN,NN)、 shape of Bis(N,NN)和 shape of Cis (K,NN),结果scalA(B,C)has shape(N,K)

如果是的形状,A(NN,NN)的形状,B是的(NN,)形状,结果只是一个标量。C(NN,)scalA(B,C)

但是,如果您期望BC具有更高的维度(大于2),则可能需要进一步调整。(我无法从你的问题中判断是否是这种情况)

于 2020-12-17T10:28:50.547 回答
0
np.einsum('ni,ji,kj->nk', B,A,C)

我认为这行得通。我没有测试就“用眼睛”写了它。

于 2020-12-17T07:48:44.520 回答