有效地找到numpy最低的非遮罩点

时间:2016-01-06 17:37:32

标签: python arrays python-3.x numpy

这里的应用程序是找到“云基础”,但这些原则适用于任何地方。我有一个numpy蒙面三维数组(我们会说它对应一个尺寸为z,y,x的三维网格框),其中我掩盖了所有值小于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

但是,这似乎效率很低,我确信有更高效或更pythonic的方式来做到这一点。我在这里缺少什么?

编辑:我不需要来使用屏蔽数组,但它似乎是提出问题的最简单方法 - 我可以找到一个特定的最低点不使用屏蔽数组的阈值。

编辑2:我正在寻找的想法(将z = 0作为最低点):

input:
[[[0,1],
  [1,5]],

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

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

threshold: val >=3
output:
[[1,1],
 [2,0]]

1 个答案:

答案 0 :(得分:1)

假设A为输入数组,您可以这样做 -

np.where((A < thresh).all(0),-1,(A >= thresh).argmax(0))

示例运行

运行#1:

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]])

运行#2:

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]])