gpt4 book ai didi

python - 对另一个矩阵的每一列进行 Numpy 矩阵减法

转载 作者:行者123 更新时间:2023-12-04 14:57:03 27 4
gpt4 key购买 nike

我知道在 numpy 中如果你有一个矩阵 A 并且我通过执行 A - v 减去一个向量 v, v 将被广播,以便 v 成为与 A 相同的维度,并且将执行元素减法。

我想知道如果我必须使用相同的 A 但使用不同的 v 多次执行上述操作,我是否能够使用矢量化来完成。

一个天真的实现如下

def foo(A, V):
"""
@params: A, V
A - an n by m matrix
V - a list of n by 1 column vectors
@returns: result
"""

result = []
for v in V:
result.append(A-v)
return result

我知道我可以将 V 作为 n x p 矩阵传递,其中每一列代表一个 v。但是,我想不出有什么方法可以用线性代数来描述上述操作

例如如果

 A = [[1 2 3], 
[1 2 3]]

V = [[1 4],
[1 4]]

输出应该是两个矩阵

[
[[0 1 2],
[0,1,2]],

[[-3 -2 -1],
[-3 -2, -1]]
]

最佳答案

a = np.zeros((4,3)) + [1,2,3]
V = [np.ones(3),np.ones(3)*2,np.ones(3)*3]

你想要的是

>>> a-V[0]
array([[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.]])
>>> a-V[1]
array([[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]])
>>> a-V[2]
array([[-2., -1., 0.],
[-2., -1., 0.],
[-2., -1., 0.],
[-2., -1., 0.]])

将向量堆叠在 V 中,然后添加一个要减去的维度。

>>> W = np.vstack(V)
>>> a - W[:,None,:]
array([[[ 0., 1., 2.],
[ 0., 1., 2.],
[ 0., 1., 2.],
[ 0., 1., 2.]],

[[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]],

[[-2., -1., 0.],
[-2., -1., 0.],
[-2., -1., 0.],
[-2., -1., 0.]]])

再次尝试调整 (n,m)(4,3)

a = np.zeros((4,3)) + [1,2,3]       # (n.m) = (4,3)
V = [np.ones(4),np.ones(4)*2,np.ones(4)*3] # three (nx1) vectors
W = np.vstack(V)

>>> a.shape
(4, 3)
>>> W.shape
(3, 4)
>>> Z = a - W[...,None]
>>> Z[0]
array([[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.]])
>>> Z[1]
array([[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]])
>>> Z[2]
array([[-2., -1., 0.],
[-2., -1., 0.],
[-2., -1., 0.],
[-2., -1., 0.]])
>>> Z.shape
(3, 4, 3)

关于python - 对另一个矩阵的每一列进行 Numpy 矩阵减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67756596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com