0

形状が 3x3x3 の numpy 整数配列「A」があります (例):

[[[***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]]]

そして、同じ形状の別の float 配列「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

array 内のすべての値に対してこのような計算を行う最も効率的な方法は何Aですか?

([***0***,1,0,1,0,1,0,1,0]) たとえばデータのような結果配列を取得する必要があります。

よろしく

4

1 に答える 1

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;
    }
}
于 2012-08-28T06:31:38.233 に答える