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

标签 python arrays numpy broadcast

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

Weights 
MyValue 
WeightedValue  = Weight * MyValue

我想确定按 Weights' axis-j 加权的 MyValue 的加权平均值(范围可能为 0 到 4)跨其他轴,除了轴 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 )

我的问题如下:

平均值是一个 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,这会在求和轴的结果中保留单一维度,并使结果适合进一步广播。

关于python - 如何将 numpy 2D 数组广播到 6D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26187093/

相关文章:

java - Java GUI 中的 Python 类

python - 生成 SQL "IN"子句 : how to safely handle input + empty value lists?

python - 使用 Python 每次运行 cmd '' ipconfig/flushdns'' 命令?

javascript - 你如何在javascript中 'search'数组?

python - 将 Python 列表就地转换为 Numpy 数组

python - Pandas 在单个数据框中保存多列的计数

javascript - 使用javascript在特定图像后插入文本

java - java中如何将一个多维数组的维度传递给另一个多维数组?

python - pandas 在两行索引之间填充值(行仅通过值查找)

python - 向量化 numpy 数组 for 循环