2D阵列的每列的外部产品形成3D阵列 - NumPy

时间:2017-01-04 17:16:01

标签: python numpy vectorization

令X为M×N矩阵。将xi表示为X的第i列。我想创建一个由M×M矩阵xi.dot(xi.T)组成的3维N x M x M阵列。

我怎么能用numpy做得最优雅呢?是否可以仅使用矩阵运算,没有循环?

1 个答案:

答案 0 :(得分:9)

使用broadcasting -

的一种方法
X.T[:,:,None]*X.T[:,None]

另一个broadcasting并在之后交换轴 -

(X[:,None,:]*X).swapaxes(0,2)

另一个broadcasting和之后的多维转置 -

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

使用np.einsum的另一种方法,如果从循环代码进行翻译,可能会更直观地考虑迭代器 -

np.einsum('ij,kj->jik',X,X)

所有这些方法的基本思想是我们展开最后一个轴,以便元素相乘,保持第一个轴对齐。我们通过将X扩展到两个3D数组版本来实现将相互的过程。