我有三个形式的六维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
,它在求和轴的结果中保留了单例维度,并使结果适合进一步广播。