如何将第ith行的numpy数组的各个元素与第ith行的另一个numpy数组的元素相乘?

时间:2019-06-26 03:27:25

标签: python numpy broadcast

如何将第ith行的numpy数组的各个元素与第ith行的另一个numpy数组的元素相乘?

库存示例是我想将大小为[280,2]的numpy数组(包含以美元,欧元计价的商品(其中280个,成本为美元)与大小为[280,3]的numpy数组相乘(库存在3个仓库中(代表该列)。

我相信使用for循环进行计算没有问题,但是我正在尝试学习广播和重塑技术。所以我希望您能帮我指出正确的方向(或方法)

编辑:示例

  Array A            
  [[1.50 1.80]        
  [3    8   ]]        

  Array B
  [[5  10 20]
  [10 20 30]]

我需要的结果是

  [[7.5 9  11.5 18  30 36]
  30  80 60   160 90  240]]

谢谢

1 个答案:

答案 0 :(得分:1)

描述有点模糊,例如:

In [264]: A=np.array([[1.5,1.8],[3,8]]); B=np.array([[5,10,20],[10,20,30]])                          
In [265]: A.shape                                                                                    
Out[265]: (2, 2)
In [266]: B.shape                                                                                    
Out[266]: (2, 3)

好像您正在尝试制作外部产品的版本,可以通过广播来完成。

让我们尝试一种组合:

In [267]: A[:,:,None]*B[:,None,:]                                                                    
Out[267]: 
array([[[  7.5,  15. ,  30. ],
        [  9. ,  18. ,  36. ]],

       [[ 30. ,  60. ,  90. ],
        [ 80. , 160. , 240. ]]])

正确的数字在那里,但顺序不正确。让我们再试一次:

In [268]: A[:,None,:]*B[:,:,None]                                                                    
Out[268]: 
array([[[  7.5,   9. ],
        [ 15. ,  18. ],
        [ 30. ,  36. ]],

       [[ 30. ,  80. ],
        [ 60. , 160. ],
        [ 90. , 240. ]]])

那更好-现在只需重塑:

In [269]: _.reshape(2,6)                                                                             
Out[269]: 
array([[  7.5,   9. ,  15. ,  18. ,  30. ,  36. ],
       [ 30. ,  80. ,  60. , 160. ,  90. , 240. ]])

_268_267.transpose(0,2,1)的部分转置。

相关问题