我有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])
这样的结果数组,例如数据。
问候
答案 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;
}
}