scipy.interpolate.griddata:裁剪z值并获取其内部区域

3
关于这个问题:类比于scipy.interpolate.griddata? 我还有一个问题:
我的输出看起来像这样:enter image description here

它是一个带有噪声的金字塔(没有地面),在scipy.interpolate.griddata中是否有可能输入/选择一个特定的z值,以便删除不等于这个z值的所有点? 在我的例子中:例如,我输入一个高z值->只有具有特定红色值(= z值)的点应该保留并显示给我一个未填充、有噪声的红色三角形。目标是获得这个噪声三角形内部的区域。
编辑: tldr:正如我刚学到的,我正在寻找一个等值线(isoline),以及其内部的区域。
编辑2: 所以我发现从这个示例http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html "grid_z1.T"返回一个包含所有z值的数组。在一个循环中,我可以消除所有不等于某个z值的值->我得到了我的等值线。问题是,它不是一个真正的等值线,而是一个带有一些等值线的网格。这是相当不错的,但也许有更好的解决方案?除了grid_z.T之外,还有哪些方法可以满足我的需求?
2个回答

1
在将数据转换为网格形式之前最好完成此操作:
>>> x = [0,4,17]
>>> y = [-7,25,116]
>>> z = [50,112,47]

>> data = np.column_stack([x, y, z])
array([[  0,  -7,  50],
       [  4,  25, 112], # <<----------------  Keep this
       [ 17, 116,  47]])
>>> data = data[data[:,2] == 112]  # points with z==112
array([[  4,  25, 112]])

然后,您可以使用griddata或例如给出的函数转换绘图数据:

X, Y, Z = grid(data[0], data[1], data[2])

如果我理解正确的话,那么我会遇到一个问题:我只有金字塔的几个点,但是你看到了所有的点,因为我进行了插值。如果我先剪掉某些点,只对它们进行插值,那么对我来说插值就不够准确。我需要使用所有给定的点进行插值,因为根据你/我的例子,具有较高和较低z值的点对三角形外观有影响,例如z=-112。 - Munchkin

0
在这种特殊情况下,我可以用一种简单的方法解决它: 不是消除所有值,而是消除所有高于某个 z 值的值:
if grid_z1.T[i][j] > z0 or math.isnan(grid_z1.T[i][j]):
    grid_z1.T[i][j] = np.nan

因为我自己定义了网格大小,所以我可以通过将网格大小乘以点数轻松地计算出面积。

附注:很抱歉回复得这么晚 - 我在医院待了一个星期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接