numpy element-wise multiplication of an array and a vector

妖精的绣舞 提交于 2021-02-04 15:14:10

问题


I want to do something like this:

a =  # multi-dimensional numpy array
ares = # multi-dim array, same shape as a
a.shape
>>> (45, 72, 37, 24)  # the relevant point is that all dimension are different
v = # 1D numpy array, i.e. a vector
v.shape
>>> (37)  # note that v has the same length as the 3rd dimension of a
for i in range(37):
    ares[:,:,i,:] = a[:,:,i,:]*v[i]

I'm thinking there has to be a more compact way to do this with numpy, but I haven't figured it out. I guess I could replicate v and then calculate a*v, but I am guessing there is something better than that too. So I need to do element wise multiplication "over a given axis", so to speak. Anyone know how I can do this? Thanks. (BTW, I did find a close duplicate question, but because of the nature of the OP's particular problem there, the discussion was very short and got tracked into other issues.)


回答1:


You can automatically broadcast the vector against the outermost axis of an array. So, you can transpose the array to swap the axis you want to the outside, multiply, then transpose it back:

ares = (a.transpose(0,1,3,2) * v).transpose(0,1,3,2)



回答2:


You can do this with Einstein summation notation using numpy's einsum function:

ares = np.einsum('ijkl,k->ijkl', a, v)



回答3:


Here is one more:

b = a * v.reshape(-1, 1)

IMHO, this is more readable than transpose, einsum and maybe even v[:, None], but pick the one that suits your style.




回答4:


I tend to do something like

b = a * v[None, None, :, None]

where I think I'm officially supposed to write np.newaxis instead of None.

For example:

>>> import numpy as np
>>> a0 = np.random.random((45,72,37,24))
>>> a = a0.copy()
>>> v = np.random.random(37)
>>> for i in range(len(v)):
...     a[:,:,i,:] *= v[i]
...     
>>> b = a0 * v[None,None,:,None]
>>> 
>>> np.allclose(a,b)
True


来源:https://stackoverflow.com/questions/19388152/numpy-element-wise-multiplication-of-an-array-and-a-vector

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