我想知道numpy
中是否存在与np.outer
类似的函数,但是使用二维数组和向量作为输入参数。重塑应该是一个三维数组。
例如,如果我有一个矩阵M
和一个向量v
,我希望每个&#34的原始矩阵M
堆叠len(v)
次;切片" M*v[j]
位置参数为j
。
这是存在于numpy还是我应该自己实现(可能会失去性能)?
答案 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)