我正在学习numpy linear algerba,我想进行一个简单的计算: 我有:
m = np.array([[1,2],
[3,4],
[5,6]]
v = np.array([10,20,30])
我想要计算/输出的内容:
[ [1/10, 2/10],
[3/20, 4/20],
[5/30, 6/30]]
基本上在m的每一行与v
的每个元素之间执行逐元素划分我可以通过一些for循环来做到这一点,但我想知道"正确的"这样做的方法。
我感觉它与广播有关,但那就是它。
感谢。
答案 0 :(得分:1)
您需要将v
的元素与m
的第一个轴对齐。一种方法是将v
扩展为具有np.newaxis/None
的2D数组,然后broadcasting
在执行元素分割时发挥作用。此外,由于两个输入都是整数数组,并且您正在执行除法,因此在执行elementwise divison之前,需要将其中一个转换为浮点数。因此,最终的实施将是 -
m/v[:,None].astype(float)
如果您使用NumPy的真正的除法函数np.true_divide
来处理浮点转换,则可以避免在用户级转换为浮点数组在引擎盖下。因此,使用它的实现将是 -
np.true_divide(m,v[:,None])
示例运行 -
In [203]: m
Out[203]:
array([[1, 2],
[3, 4],
[5, 6]])
In [204]: v
Out[204]: array([10, 20, 30])
In [205]: m/v[:,None].astype(float)
Out[205]:
array([[ 0.1 , 0.2 ],
[ 0.15 , 0.2 ],
[ 0.16666667, 0.2 ]])
In [206]: np.true_divide(m,v[:,None])
Out[206]:
array([[ 0.1 , 0.2 ],
[ 0.15 , 0.2 ],
[ 0.16666667, 0.2 ]])