我有一组长度为m的n个向量。例如, n = 3 , m = 2 :
x = array([[1, 2], [3, 4], [5,6]])
我想将每个向量的外积与自身相连,然后将它们连接成一个形状为(n,m,m)的方形矩阵数组。所以对于上面的x
我会得到
array([[[ 1, 2],
[ 2, 4]],
[[ 9, 12],
[12, 16]],
[[25, 30],
[30, 36]]])
我可以使用for
循环这样做
np.concatenate([np.outer(v, v) for v in x]).reshape(3, 2, 2)
如果没有Python for
循环,是否有一个numpy表达式?
额外问题:由于外部产品是对称的,我不需要 m x m 乘法运算来计算它们。我可以从numpy获得这种对称性优化吗?
答案 0 :(得分:4)
也许使用einsum
?
>>> x = np.array([[1, 2], [3, 4], [5,6]])
>>> np.einsum('ij...,i...->ij...',x,x)
array([[[ 1, 2],
[ 2, 4]],
[[ 9, 12],
[12, 16]],
[[25, 30],
[30, 36]]])
答案 1 :(得分:0)
当我在Theano尝试做同样的事情时,我使用了以下片段:
def multiouter(A,B):
'''Provided NxK (Theano) matrices A and B it returns a NxKxK tensor C with C[i,:,:]=A[i,:]*B[i,:].T'''
return A.dimshuffle(0,1,'x')*B.dimshuffle(0,'x',1)
直接转换为Numpy产量
def multiouter(A,B):
'''Provided NxK (Numpy) arrays A and B it returns a NxKxK tensor C with C[i,:,:]=A[i,:]*B[i,:].T'''
return A[:,:,None]*B[:,None,:]
我认为我从另一个StackOverflow帖子中得到了灵感,所以我不确定我是否可以获得所有功劳。
注意:使用None
建立索引相当于使用np.newaxis
建立索引并实例化一个维度为1的新轴。