Multiply each row of one array with each element of another array in numpy

穿精又带淫゛_ 提交于 2020-01-30 05:12:14

问题


I have two arrays A and B in numpy. A holds cartesian coordinates, each row is one point in 3D space and has the shape (r, 3). B has the shape (r, n) and holds integers.

What I would like to do is multiply each element of B with each row in A, so that the resulting array has the shape (r, n, 3). So for example:

# 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]]]

I'm pretty sure this can be done with np.einsum, but I've been trying this for quite a while now and can't get it to work.


回答1:


Use broadcasting -

A[:,None,:]*B[:,:,None]

Since np.einsum also supports broadcasting, you can use that as well (thanks to @ajcr for suggesting this concise version) -

np.einsum('ij,ik->ikj',A,B)

Sample run -

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


来源:https://stackoverflow.com/questions/32561332/multiply-each-row-of-one-array-with-each-element-of-another-array-in-numpy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!