Python 使用numpy有效地找到最低非屏蔽点

Python 使用numpy有效地找到最低非屏蔽点,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,这里的应用程序正在寻找“云基础”,但原则适用于任何地方。我有一个numpy掩蔽的3-D数组(我们会说它对应于一个尺寸为z,y,x的3-D网格盒),其中我掩蔽了所有值小于0.1的点。我想找到的是,在每个x,y点上,没有被遮罩的最低z点索引是什么(不是z中的最低值,最小的z坐标)。我可以想出一些简单的方法,例如: for x points: for y points: minz=-1 for z points: if x,y,z is

这里的应用程序正在寻找“云基础”,但原则适用于任何地方。我有一个numpy掩蔽的3-D数组(我们会说它对应于一个尺寸为z,y,x的3-D网格盒),其中我掩蔽了所有值小于0.1的点。我想找到的是,在每个x,y点上,没有被遮罩的最低z点索引是什么(不是z中的最低值,最小的z坐标)。我可以想出一些简单的方法,例如:

for x points:
    for y points:
        minz=-1
        for z points:
            if x,y,z is not masked:
                 minz = z 
                 break
然而,这似乎真的很低效,我相信有一种更有效或更具python风格的方法来做到这一点。我错过了什么

编辑:我不需要使用遮罩数组,但这似乎是问这个问题的最简单方法-我可以在不使用遮罩数组的情况下找到某个阈值下的最低点

编辑2:我想要的想法(以z=0为最低点):


假设
A
作为输入数组,您可以-

np.where((A < thresh).all(0),-1,(A >= thresh).argmax(0))
np.其中((A=thresh.argmax(0))
样本运行

运行#1:

[87]中的
:A
出[87]:
数组([[0,1],
[1, 5]],
[[3, 3],
[2, 4]],
[[2, 1],
[4, 9]]])
[88]中:thresh=3
在[89]中:名词短语,其中((A=thresh.argmax(0))
出[89]:
数组([[1,1],
[2, 0]])
运行#2:

[82]中的
:A
出[82]:
数组([[17,1,2,3],
[ 5, 13, 11,  2],
[ 9, 16, 11, 19],
[11, 16,  6,  3],
[15,  9, 14, 14]],
[[18, 19,  5,  8],
[13, 13, 17,  2],
[17, 12, 16,  0],
[19, 14, 12,  5],
[ 7,  8,  4,  7]],
[[10, 12, 11,  2],
[10, 18,  6, 15],
[ 4, 16,  0, 16],
[16, 18,  2,  1],
[10, 19,  9,  4]]])
在[83]中:thresh=10
在[84]中:np.式中((A=thresh.argmax(0))
出[84]:
数组([[0,1,2,-1],
[ 1,  0,  0,  2],
[ 1,  0,  0,  0],
[ 0,  0,  1, -1],
[ 0,  2,  0,  0]])

掩蔽后没有
z
的(x,y)情况下输出什么?一些区分符,如-1可以工作-只要注意到缺少数据,我可以相应地绘制。输出不应该是
[[1,1],[2,1]]
而不是编辑2?否-我在寻找z中的最低点-而不是最低点-抱歉造成混淆。输出是正确的,我将致力于澄清这个问题。这与下面的答案配合得很好。然而,我试图找到z指数,而不是z值。有没有一种更有效的方法可以做到这一点,而不必对每一个单独进行np.Unlavel_索引?我将编辑我的问题以澄清,sorry@Laxsnor使用
.argmin
然后代替
.min
?实际上-刚刚测试过-我不是在寻找未屏蔽的最小值,而是在寻找未屏蔽的最低点。很抱歉造成混淆-请参阅上面我的编辑。在您的示例中,第一行输出将改为:[16,11,19,18]。编辑后的答案仍然存在与以前相同的问题-它检索的是最小非屏蔽点,而不是最低非屏蔽点。我在问题中进一步澄清了我的预期输入/输出。您的答案第一行应该是(取0为“最低”):[1,2,0,0]或(取2为最低):[2,2,2,1]。我应该更好地区分最小值和最小值——我是说z坐标最小的那个。最新的编辑看起来效果很好,非常感谢!我接受了你的回答。
np.where((A < thresh).all(0),-1,(A >= thresh).argmax(0))
In [87]: A
Out[87]: 
array([[[0, 1],
        [1, 5]],

       [[3, 3],
        [2, 4]],

       [[2, 1],
        [4, 9]]])

In [88]: thresh = 3

In [89]: np.where((A < thresh).all(0),-1,(A >= thresh).argmax(0))
Out[89]: 
array([[1, 1],
       [2, 0]])
In [82]: A
Out[82]: 
array([[[17,  1,  2,  3],
        [ 5, 13, 11,  2],
        [ 9, 16, 11, 19],
        [11, 16,  6,  3],
        [15,  9, 14, 14]],

       [[18, 19,  5,  8],
        [13, 13, 17,  2],
        [17, 12, 16,  0],
        [19, 14, 12,  5],
        [ 7,  8,  4,  7]],

       [[10, 12, 11,  2],
        [10, 18,  6, 15],
        [ 4, 16,  0, 16],
        [16, 18,  2,  1],
        [10, 19,  9,  4]]])

In [83]: thresh = 10

In [84]: np.where((A < thresh).all(0),-1,(A >= thresh).argmax(0))
Out[84]: 
array([[ 0,  1,  2, -1],
       [ 1,  0,  0,  2],
       [ 1,  0,  0,  0],
       [ 0,  0,  1, -1],
       [ 0,  2,  0,  0]])