在python中将元素减到行数组

在python中将元素减到行数组,python,numpy,Python,Numpy,我有两个numpy数组a和b a=np.array([[1,2,3],[4,5,6],[7,8,9]]) array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = np.array([1,2,3]) array([1, 2, 3]) 我想在a的每一行减去b的对应元素,即a的第一行,b的第一个元素,等等 所以c是 array([[0, 1, 2], [2, 3, 4], [4, 5, 6]]) 有pyth

我有两个numpy数组a和b

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

b = np.array([1,2,3])
array([1, 2, 3])
我想在a的每一行减去b的对应元素,即a的第一行,b的第一个元素,等等 所以c是

array([[0, 1, 2],
       [2, 3, 4],
       [4, 5, 6]])

有python命令可以执行此操作吗?

是的!你只需要先把b作为一个列向量

a - b[:, np.newaxis]
是否有python命令来执行此操作

是的,接线员

此外,您需要将b转换为列向量,以便广播可以为您完成其余工作:

a - b[:, np.newaxis]

# array([[0, 1, 2],
#        [2, 3, 4],
#        [4, 5, 6]])
将b重塑为列向量,然后减去:

a - b.reshape(3, 1)
b没有就地更改,但整形方法调用的结果将是列向量:

array([[1],
       [2],
       [3]])
允许你想要的减法的形状。更一般的重塑操作是:

b.reshape(b.size, 1)
不管b有多少个元素,把它们塑造成一个nx1向量


更新:一个快速的基准测试显示,使用b[:,np.newaxis]作为重塑策略,速度将提高约7%。对于小向量,这几个额外的分数aµs无关紧要。但对于大向量或内部循环,更喜欢他的方法。这是一种不太通用的整形,但在这种情况下性能更高。

您的问题完全由标记副本中的前两个答案回答。通用整形的小附录:b.Reformate-1,1允许Reformate自动设置一维尺寸,而无需显式查询b.shape。@kazemakase说得好。我不确定OP是否已经准备好使用-1通配符,但自从您使用它以来,它在不损失通用性的情况下调整了性能。竖起大拇指。