3

我正在学习 numpy 线性阿尔格巴,我想执行一个简单的计算:我有:

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 循环来做到这一点,但我想知道“正确”的做法。

我感觉它与广播有关,但仅此而已。

谢谢。

4

1 回答 1

2

您需要将 的元素与v的第一个轴对齐m。这样做的一种方法是扩展v到二维数组,np.newaxis/None然后broadcasting在执行元素除法时发挥作用。此外,由于两个输入都是整数数组并且您正在执行除法,因此您需要在执行元素除法之前将其中一个转换为浮点数。因此,最终的实现将是 -

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       ]])
于 2015-11-26T21:45:25.890 回答