在numpy中创建外部产品数组

时间:2013-08-18 18:26:13

标签: python numpy indexing

我有一组长度为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获得这种对称性优化吗?

2 个答案:

答案 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的新轴。