根据三维numpy数组中的值定义二维numpy数组

q3aa0525  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(183)

我有一个3D numpy数组,表示一个39层、279行、153列的模型域,数组中的值为0或1,表示域中的单元格是活动的还是非活动的,我试图创建一个279行153列的二维数组,其中数组值等于网格中最上面的活动层的层数。基本上,在每一行,列的位置,我想循环通过层,找到第一个是1,而不是0,然后把该层的号码放在二维数组中的该行,列的位置。例如:
如果一个四层(层0-3)阵列如下所示:

array([[[ 0.,  1.,  0.,  0.],
        [ 1.,  0.,  0.,  0.],
        [ 1.,  0.,  0.,  0.]],

       [[ 0.,  1.,  1.,  0.],
        [ 1.,  1.,  0.,  0.],
        [ 1.,  1.,  0.,  0.]],
   
       [[ 0.,  0.,  1.,  1.],
        [ 0.,  1.,  1.,  0.],
        [ 0.,  1.,  1.,  0.]],

       [[ 0.,  0.,  1.,  1.],
        [ 0.,  1.,  1.,  1.],
        [ 0.,  1.,  1.,  1.]]])

二维数组应如下所示:

array([[[ 0.,  0.,  1.,  2.],
        [ 0.,  1.,  2.,  3.],
        [ 0.,  1.,  2.,  3.]],

如果row-col位置在任何层中都不活动(不等于1),则结果数组中的值应为0(类似于1,1),就像它在层0中处于活动状态一样。
我尝试过修改两个解决方案,其中z轴值被求和或平均,但似乎不能找出如何得到我正在寻找的确切内容。

k3bvogb1

k3bvogb11#

您可以尝试numpy.argmax

import numpy as np
a = np.array([[[ 0.,  1.,  0.,  0.],
    [ 1.,  0.,  0.,  0.],
    [ 1.,  0.,  0.,  0.]],

   [[ 0.,  1.,  1.,  0.],
    [ 1.,  1.,  0.,  0.],
    [ 1.,  1.,  0.,  0.]],

   [[ 0.,  0.,  1.,  1.],
    [ 0.,  1.,  1.,  0.],
    [ 0.,  1.,  1.,  0.]],

   [[ 0.,  0.,  1.,  1.],
    [ 0.,  1.,  1.,  1.],
    [ 0.,  1.,  1.,  1.]]])
print(np.argmax(a,0))

 
array([[0, 0, 1, 2],
       [0, 1, 2, 3],
       [0, 1, 2, 3]])

这是因为在定义的轴(在本例中为第0个轴)上搜索时,argmax返回第一个最大值。

相关问题