3

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

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

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

4

2 回答 2

3

您正在与来自 的元素M一起缩放,这是一个数组。因此,您需要使用 扩展为 2D 数组,这将与 之间的轴对齐。然后,在这两个数组之间执行逐元素乘法以引入矢量化解决方案,如下所示 -axis=2w1Dwnp.newaxis/Noneextended version of wMbroadcasting

M *= w[:,None]

如果axis=2ofM的长度大于 中的元素数,则w需要在相乘之前选择一个范围axis=2M如下所示 -

M[...,np.arange(w.size),:] *= w[:,None]
于 2016-02-08T11:16:55.747 回答
1

这个答案是基于我试图理解@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
于 2016-02-08T12:13:57.933 回答