如何将numpy 2D数组广播到6D数组



我有三个形式的六维Numpy数组(运行在python 3.4上)

Weights 
MyValue 
WeightedValue  = Weight * MyValue

我想确定由Weights’轴-j(其范围可能从0到4)在其他轴上加权的MyValue的加权平均值,除了轴5是常数。

(因此,当j=2时,我们在0,1,3,4之间求平均值)。

然后我打算取这个平均值,乘以Weights,然后从WeightedValue 中减去乘积

我打算这样做是

NewArray   = WeightedValue - Weight * fn( Weighted Value, Weights )
NewMyValue = NewArray / Weights

fn()将是MyValue的平均值,定义为:

               the sum of Weighted Value using 4 axes ( all except j and 5 )
< divided by >---------------------------------------------------------------
               the sum of Weights across 4 axes       ( all except j and 5 )

我的问题如下:

Average Value是一个2D数组,我需要fn()来生成6D数组,即在其他4维上广播2D结果

作为最后的手段,我可以创建一系列循环来迭代轴j和轴5。对于第二个轴(j=1),循环如下

import numpy as np
result = np.zeros((dim0,dim1,dim2,dim3,dim4,dim5))
for var1 in range(dim1):
    for var5 in range(dim5):
        result[:,dim1,:,:,:,dim5] = AverageValue[dim1,dim5]  

但我希望有一种更直接、更通用的方法

您可以使用:代替fn

j = 1;
axes = tuple({0,1,2,3,4} - {j})
fn = WeightedValue.sum(axes, keepdims=True) / Weights.sum(axes, keepdims=True)

显然,关键是通过keepdims=True,它在求和轴的结果中保留了单例维度,并使结果适合进一步广播。

最新更新