这里的应用程序是找到“云基础”,但这些原则适用于任何地方。我有一个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]]
答案 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]])