对于矢量/矩阵“外部”产品,是否存在类似于`np.outer`的功能?

时间:2015-03-05 11:36:54

标签: python arrays numpy matrix linear-algebra

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用普通array broadcasting

执行此操作
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])

答案 1 :(得分:1)

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

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