numpy:重写外部乘积并以矢量形式添加对角线

时间:2019-12-11 15:21:22

标签: python numpy

假设X是:

X = np.asarray(
   [0.5, 0.5],
   [0.87070241, 0.12929759],
   [0.97738616, 0.02261384],
   [0.99200957, 0.00799043]], dtype=np.float32)

对于每一行,我想将一行变成对角矩阵,并从中减去外积,如下所示:

np.diagflat(X[i, :]) - np.outer(X[i, :], X[i, :])

对于任何索引i

当然,我可以在i上编写一个for循环,但是有没有办法以向量化的形式来实现它?

我发现似乎可以将减去的部分重写为:

X.T[:, None, :] * X.T[None, :]

但仍然不知道如何在不添加for循环的情况下正确地在其中添加diagflat或其等效内容。

1 个答案:

答案 0 :(得分:2)

可能有一种更具可读性的方法,但是:

(np.eye(2) * X[:, np.newaxis]) - (X[:, np.newaxis]) * X[..., np.newaxis]

应该做你想做的事。

编辑:从OP修正后,我的最初回答为(np.eye(2)[np.newaxis] - X[:, np.newaxis]) * X[..., np.newaxis]