我想知道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)