假设X是一个M x N的矩阵,用xi表示X的第i列。我想创建一个由M x M矩阵构成的三维N x M x M数组,每个矩阵是xi.dot(xi.T)
。
如何使用numpy最优雅地实现?是否可能只使用矩阵运算而不需要循环来完成这个操作?
假设X是一个M x N的矩阵,用xi表示X的第i列。我想创建一个由M x M矩阵构成的三维N x M x M数组,每个矩阵是xi.dot(xi.T)
。
如何使用numpy最优雅地实现?是否可能只使用矩阵运算而不需要循环来完成这个操作?
broadcasting
的一种方式 -X.T[:,:,None]*X.T[:,None]
另一个使用 broadcasting
并在其后交换轴的方法 -
(X[:,None,:]*X).swapaxes(0,2)
另一个涉及广播和多维转置的操作 -
(X[:,None,:]*X).T
使用np.einsum
的另一个方法,如果您从循环代码进行转换,则可能更加直观地考虑涉及的迭代器-
np.einsum('ij,kj->jik',X,X)
Ni * Ni.T
。每列的长度为Mrows = 2,因此乘积产生一个(2,2)矩阵,即(Mrows,Mrows)。对于每一列进行这样的操作,并将结果堆叠在第三维中,应该得到一个(M x M x N)矩阵。 - Matt Pfor i in range(N): out[i] = X[:,i,None].dot(X[None,:,i])
。 - DivakarResult = np.dstack( X[:,i].reshape((nrows,1)) * X[:,i] for i in range(ncols) )
. - Matt Pxi = X[:,i,None]
,然后使用OP的代码:xi.dot(xi.T)
。 - Divakar