从numpy数组的每列中查找值是基于来自另一个numpy数组的和的比较

时间:2012-08-28 05:52:42

标签: multidimensional-array filter numpy sum

我有numpy整数数组“A”,形状为3x3x3(例如):

[[[***0***,1,0], [1,1,0], [0,1,1]]

[[***1***,1,0], [0,1,1], [0,0,1]]

[[***0***,1,0], [1,0,0], [1,0,0]]]

另一个具有相同形状的浮点数组“B”:

[[[ ***0.19***,0.02,0.65],[ 0.88,0.11,0.07],[ 0.26,0.88,0.17]]

 [[ ***0.13***,0.20,0.48],[ 0.40,0.07,0.67],[ 0.31,0.47,0.01]]

 [[ ***0.40***,0.31,0.92],[ 0.45,0.26,0.53],[ 0.46,0.24,0.47]]]

我需要以下内容:

- 计算第一个数组A中某个轴的唯一值(例如value(0,0,0)value(1,0,0)value(2,0,0))

0, 1, 0 = > "0" - 2 values  and "1" – 1 value.

- 计算数组B中的适当总和:

0 => 0.19+0.4 = 0.59; 1 => 0.13

- 数组A中的查找值,数组B中的最大总和:

0.59>0.13 => value 0

对数组A中的所有值进行此类计算的最有效方法是什么?

我需要获得像([***0***,1,0,1,0,1,0,1,0])这样的结果数组,例如数据。

问候

1 个答案:

答案 0 :(得分:0)

由于您必须读取每个值以进行求和或比较,因此该算法应具有O(n)复杂度(其中n是矩阵中的项目总数)。在这里,您可以找到在O(n)时间内计算所需内容的过程:

对于矩阵A[x][y][z]B[x][y][z]。假设A中的值在0到9之间变化。

由于您计算每个y轴的值,我们将得到[x,z]对的值:

x: order of tuple in horizontal 
z: order of value in that tuple

首先,定义一个加权和数组,它保存每个Y轴上A中每个值的和值:W[x][z][value]

计算权重如下:

for(x=0; x<3; x++) 
{
    for(z=0; z<3; z++) 
    {
        for(y=0; y<3; y++) 
        {
            val = A[x][y][z];
            W[x][z][val] += B[x][y][z];
        }
    }
} 

然后使用此加权和数组计算A:

中的显性值
for(x=0; x<3; x++) 
{
    for(z=0; z<3; z++) 
    {
        maxSum = 0;
        dominantValue = 0;
        for(val=0; val<10; val++)
        {
            if(W[x][z][val] > maxSum)
            {
                maxSum = W[x][z][val];
                dominantValue = val;
            }
        }
        result[x][z] = val;
        //OR: result[3*x+z] = val;
    }
}