对于向量/矩阵"outer"乘积,是否有类似于"np.outer"的函数?



我想知道numpy中是否有一个函数的作用类似于np.outer,但使用二维数组和向量作为输入参数。资源应该是一个三维数组。

例如,如果我有一个矩阵M和一个向量v,我希望原始矩阵M堆叠len(v)次,每个"切片"都是M*v[j]j位置参数。

这在numpy中存在吗?还是我应该自己实现(可能会损失性能)?

您可以使用正常的数组广播:

M = np.arange(9).reshape(3, 3)
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])
v = np.arange(4)
# array([0, 1, 2, 3])
Mv = M[:, :, None] * v[None, None, :]
# array([[[ 0,  0,  0,  0],
#         [ 0,  1,  2,  3],
#         [ 0,  2,  4,  6]],
#        [[ 0,  3,  6,  9],
#         [ 0,  4,  8, 12],
#         [ 0,  5, 10, 15]],
#        [[ 0,  6, 12, 18],
#         [ 0,  7, 14, 21],
#         [ 0,  8, 16, 24]]])
# you could use np.newaxis in place of None (np.newaxis is just an alias of 
# None). you could also omit the 'None's in the indices into v:
# Mv = M[:, :, None] * v
# check
for jj in xrange(v.shape[0]):
    assert np.all(Mv[:, :, jj] == M * v[jj])

另一种可能性是使用np.einsum。在某些情况下,一旦你熟悉了它,它就会产生一个更清晰的语法(对我来说):

Mv = np.einsum('ij, k->ijk', M, v)

相关内容

  • 没有找到相关文章

最新更新