我有一个N * M矩阵A和一个N长度向量V.我想做A + V,其中A的行i中的每个元素与V中的元素i相加。怎么做?< / p>
e.g:
A = np.random.rand(3,2)
V = np.array([1,2,3])
A + V
ValueError: operands could not be broadcast together with shapes (3,2) (3)
我想用乘法和除法做同样的事。
答案 0 :(得分:1)
解决方案:
V = V.reshape(-1,1)
A + V
现在可行了
答案 1 :(得分:0)
这里要查找的概念是broadcasting。它使您能够在任何两个矩阵之间进行逐点交互,只要它们的形状对应,或者在没有对应的轴上,至少有一个边是简并的,即大小为1
。在您的情况下,您需要将轴添加到V.可以如下优雅地执行此操作
A + V[:, np.newaxis]
答案 2 :(得分:0)
你需要告诉numpy它必须将向量V
的维度扩展为1,你可以使用特殊索引np.newaxis
来完成它。它看起来像这样:
import numpy as np
A = np.array([[10,20],[100,200],[1000,2000]])
V = np.array([1,2,3])
A + V[:,np.newaxis]
array([[ 11, 21],
[ 102, 202],
[1003, 2003]])
来自slicing docs:
选择元组中的每个newaxis对象用于将结果选择的维度扩展一个单位长度维度。添加的维度是newaxis对象在选择元组中的位置。