矩阵和向量之间的numpy广播?

时间:2015-11-26 21:43:07

标签: python numpy numpy-broadcasting

我正在学习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循环来做到这一点,但我想知道"正确的"这样做的方法。

我感觉它与广播有关,但那就是它。

感谢。

1 个答案:

答案 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       ]])