【问题标题】:Find the lowest non-masked point with numpy efficiently使用 numpy 有效地找到最低的非屏蔽点
【发布时间】:2016-01-06 17:37:32
【问题描述】:

这里的应用程序正在寻找“云基础”,但原则适用于任何地方。我有一个 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

但是,这似乎真的很低效,我相信有一种更有效或更 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]]

【问题讨论】:

  • 在屏蔽后没有 z 的 (x,y) 案例输出什么?
  • 一些诸如 -1 之类的区分符会起作用——只要注意到缺少数据并且我可以相应地绘制。
  • 不应该输出[[1,1],[2,1]] 而不是Edit 2吗?
  • 不 - 我正在寻找 z 中的最低点 - 不是最低值 - 很抱歉造成混淆。输出是正确的,我将进一步澄清问题

标签: python arrays python-3.x numpy


【解决方案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]])

【讨论】:

  • 这与下面的答案一起工作得很好——但是,我试图找到 z 索引,而不是 z 值。有没有一种更有效的方法来做到这一点,而无需单独对每个人执行 np.unravel_index ?我将编辑我的问题以澄清,对不起
  • @Laxsnor 使用.argmin 然后代替.min?
  • 实际上-刚刚测试过-我不是在寻找未屏蔽的最小值,而是在寻找未屏蔽的最低点。很抱歉造成混淆 - 请参阅我上面的编辑。在您的示例中,输出的第一行将改为:[16,11,19,18]。
  • 编辑后的答案仍然存在与以前相同的问题 - 它正在检索最小的非屏蔽点而不是最低的非屏蔽点。我在我的问题中进一步澄清了我的预期输入/输出。你的答案第一行应该是(取 0 为“最低”):[1,2,0,0] 或(取 2 为最低):[2,2,2,1]。我应该更好地区分最低和最低——我的意思是 z 坐标最小的那个。
  • 最新的编辑看起来效果很好,非常感谢!我接受了你的回答。
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 2018-04-30
  • 2011-08-11
  • 1970-01-01
  • 2021-08-08
  • 2012-03-18
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多