Python 在numpy阵列中为平面加权的最佳方法是什么?

Python 在numpy阵列中为平面加权的最佳方法是什么?,python,numpy,array-broadcasting,Python,Numpy,Array Broadcasting,我有下面的代码,其中w是一个兼容维度的1D numpy数组,M是一个4D数组 i = 0 for weight in w: M[:, :, i, :] *= weight i += 1 有没有更好的方法来达到同样的效果?您正在使用w中的元素沿轴=2缩放M,这是一个1D数组。因此,您需要将w扩展到二维数组,该数组将对齐扩展版本w与M之间的轴。然后,在这两个数组之间执行元素相乘,以引入向量化解决方案,如下所示- M *= w[:,None] M[...,np.arange(w.s

我有下面的代码,其中w是一个兼容维度的1D numpy数组,M是一个4D数组

i = 0
for weight in w:
    M[:, :, i, :] *= weight
    i += 1

有没有更好的方法来达到同样的效果?

您正在使用
w
中的元素沿
轴=2
缩放
M
,这是一个
1D
数组。因此,您需要将
w
扩展到二维数组,该数组将对齐
扩展版本w
M
之间的轴。然后,在这两个数组之间执行元素相乘,以引入向量化解决方案,如下所示-

M *= w[:,None]
M[...,np.arange(w.size),:] *= w[:,None]
如果
M
axis=2
的长度大于
w
中的元素数,则需要在相乘之前沿
M
中的
axis=2
选择一个范围,如下所示-

M *= w[:,None]
M[...,np.arange(w.size),:] *= w[:,None]

这个答案是基于我试图理解@Divakar的答案。 帮助我了解情况的是写下他们的建议

M *= w[:,None]
作为

其中,M和延伸w的尺寸明显相同。当然,@Divakar的版本更短,更优雅,但不那么直观

因此,一个完整的工作示例是:

import numpy as np
M = np.ones((1,4,3,2))
w = np.arange(3)
M *= w[None,None,:,None]
print M

谢谢我将Divakar的版本标记为正确,因为它们都是正确的,而他是第一个。我更喜欢你更明确的方式。为了更明确,你可以用
np.newaxis
替换
None
M*=w[np.newaxis,np.newaxis,:,np.newaxis]