Python 将一个数组的每一行与另一个数组的每一个元素相乘,单位为numpy

Python 将一个数组的每一行与另一个数组的每一个元素相乘,单位为numpy,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我在numpy中有两个数组A和BA保持笛卡尔坐标,每行是三维空间中的一个点,并具有形状(r,3)B具有形状(r,n)并保存整数 我想做的是将B的每个元素与A中的每一行相乘,这样得到的数组具有形状(r,n,3)。例如: # r = 3 A = np.array([1,1,1, 2,2,2, 3,3,3]).reshape(3,3) # n = 2 B = np.array([10, 20, 30, 40, 50, 60]).reshape(3,2) # Result with shape (3,

我在numpy中有两个数组A和BA保持笛卡尔坐标,每行是三维空间中的一个点,并具有形状(r,3)B具有形状(r,n)并保存整数

我想做的是将B的每个元素与A中的每一行相乘,这样得到的数组具有形状(r,n,3)。例如:

# r = 3
A = np.array([1,1,1, 2,2,2, 3,3,3]).reshape(3,3)
# n = 2
B = np.array([10, 20, 30, 40, 50, 60]).reshape(3,2)

# Result with shape (3, 2, 3):
# [[[10,10,10], [20,20,20]],
# [[60,60,60], [80,80,80]]
# [[150,150,150], [180,180,180]]]
我很确定这是可以做到的,但我已经尝试了很长一段时间,现在无法让它工作

使用-

因为它也支持广播,所以您也可以使用它(感谢@ajcr推荐了这个简洁的版本)-

样本运行-

In [22]: A
Out[22]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [23]: B
Out[23]: 
array([[10, 20],
       [30, 40],
       [50, 60]])

In [24]: A[:,None,:]*B[:,:,None]
Out[24]: 
array([[[ 10,  10,  10],
        [ 20,  20,  20]],

       [[ 60,  60,  60],
        [ 80,  80,  80]],

       [[150, 150, 150],
        [180, 180, 180]]])

In [25]: np.einsum('ijk,ij->ijk',A[:,None,:],B)
Out[25]: 
array([[[ 10,  10,  10],
        [ 20,  20,  20]],

       [[ 60,  60,  60],
        [ 80,  80,  80]],

       [[150, 150, 150],
        [180, 180, 180]]])

我想你可以用
np.einsum('ij,ik->ikj',A,B)
来表示
einsum
np.einsum('ij,ik->ikj',A,B)
In [22]: A
Out[22]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

In [23]: B
Out[23]: 
array([[10, 20],
       [30, 40],
       [50, 60]])

In [24]: A[:,None,:]*B[:,:,None]
Out[24]: 
array([[[ 10,  10,  10],
        [ 20,  20,  20]],

       [[ 60,  60,  60],
        [ 80,  80,  80]],

       [[150, 150, 150],
        [180, 180, 180]]])

In [25]: np.einsum('ijk,ij->ijk',A[:,None,:],B)
Out[25]: 
array([[[ 10,  10,  10],
        [ 20,  20,  20]],

       [[ 60,  60,  60],
        [ 80,  80,  80]],

       [[150, 150, 150],
        [180, 180, 180]]])