1

我有一个长度为 m 的 n 个向量的数组。例如,对于n = 3m = 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)

是否有一个 numpy 表达式可以在没有 Pythonfor循环的情况下执行此操作?

额外的问题:由于外积是对称的,我不需要mxm乘法运算来计算它们。我可以从 numpy 获得这种对称优化吗?

4

2 回答 2

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]]])
于 2013-08-18T18:35:14.977 回答
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 帖子中得到灵感的,所以我不确定我是否能得到所有的功劳。

注意:indexing withNone等同于 indexing withnp.newaxis并实例化一个维度为 1 的新轴。

于 2016-04-03T15:10:30.180 回答