在 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]
如果 M
的 axis=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
我有以下代码,其中 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]
如果 M
的 axis=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