我有一个NumPy的ndarray,形状为(32, 1024),保存着32个信号测量值。我想将它们结合成一个长度为1024的数组,并且每个信号都有不同的权重。我原本使用numpy.average函数,但我的权重是复杂的,average函数会基于权重总和进行归一化,导致结果出错。
查看average函数的代码后,我意识到可以通过将权重乘以信号数组,然后对第一轴求和来实现相同的功能。但是,当我尝试将(32,)的权重数组乘以(32,1024)的信号数组时,由于(32,)无法广播到(32,1024),所以维度不匹配。如果我将权重数组重新调整为(32,1),那么一切都符合预期,但这会导致代码变得非常丑陋:
查看average函数的代码后,我意识到可以通过将权重乘以信号数组,然后对第一轴求和来实现相同的功能。但是,当我尝试将(32,)的权重数组乘以(32,1024)的信号数组时,由于(32,)无法广播到(32,1024),所以维度不匹配。如果我将权重数组重新调整为(32,1),那么一切都符合预期,但这会导致代码变得非常丑陋:
avg = (weights.reshape((32, 1)) * data).sum(axis=0)
有人能解释一下为什么 NumPy 不允许我的 (32,) 数组进行广播到 (32, 1024) 吗?或者建议一个替代方案,更加简洁地执行加权平均?
(1, 32)
或(1024,32)
;但是你必须允许它将(32,)
扩展为(32,1)
。这避免了其他情况下的歧义,例如当乘以(32,)和(1024,)时。更多信息请参见我的最近回答,http://stackoverflow.com/a/39238203/901925。 - hpaulj