在 numpy 数组中加权平面的最佳方法是什么?

What is the nicest way to weight planes in a numpy array?

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

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

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

您正在使用 w 中的元素沿 axis=2 缩放 M,这是一个 1D 数组。因此,您需要将 w 扩展到具有 np.newaxis/None, which will align the axes between extended version of w with M. Then, perform element-wise multiplication between these two arrays to bring in broadcasting 的二维数组以获得矢量化解决方案,就像这样 -

M *= w[:,None]

如果 Maxis=2 的长度大于 w 中的元素数量,您需要 select 沿着 [=13= 的范围] 在 M 乘法之前,像这样 -

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

这个答案是基于我试图理解@Divakar 的答案。 帮助我理解发生了什么的是写下他们对

的建议
M *= w[:,None]

作为

M *= w[None,None,:,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