假設我有一組方陣Sigma1, Sigma2, ... 。這些存盤在一個 numpy 陣列中,Sigma例如Sigma[0, :, :] = Sigma1, Sigma[1, :, :] = Sigma2,等等。
我有一組相應的向量v1, v2, ...,存盤在一個矩陣v中v[0, :] = v1, v[1, :] = v2,等等。
我正在嘗試生成一個向量 a 使得 a[0] 是v1.T @ Sigma1 @ v1(一個標量值),a[1] 是v2.T @ Sigma2 @ v2等等。
我einsum tensordot對諸如此類的檔案感到有些困惑,這些檔案看起來很有希望,但我一直無法強迫我給出想要的答案。
例如:
Sigma = np.empty(4, 3, 3)
for i in range(4):
Z = np.random.randn(10, 3)
Sigma[i, :, :] = Z.T @ Z
y = np.random.randn(4, 3)
我想要一個函式foo(Sigma y),它回傳一個等價于的向量
bar = np.empty(4)
for i in range 4:
bar[i] = y[i, :].T @ Sigma[i, :, :] @ y[i, :]
return bar
uj5u.com熱心網友回復:
np.einsum('ij,ijk,ik -> i', y, Sigma, y)
就是你要找的。
In [1]: Sigma = np.random.rand(4, 3, 3)
In [2]: y = np.random.rand(4, 3)
In [3]: bar = np.empty(4)
...: for i in range(4):
...: bar[i] = y[i, :].T @ Sigma[i, :, :] @ y[i, :]
...:
In [4]: bar_einsum = np.einsum('ij,ijk,ik -> i', y, Sigma, y)
In [5]: np.allclose(bar, bar_einsum)
Out[5]: True
uj5u.com熱心網友回復:
看起來你想要(未測驗)
y[i, :].T @ Sigma[i, :, :] @ y[i, :]
np.einsum('ij,ijk,ik',y,Sigma,y)
一個matmul版本應該是可能的,但einsum更容易撰寫
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383407.html
上一篇:如何轉置3d/2d串列?
下一篇:分解每一列資料框而不重復資料
