从 1D 图到 2D mask

From 1D graph to 2D mask

我已经计算出我想要采样点的边界。

例如,一个数据集如下所示:

现在我想在红色区域中找到点,我通过以下方式进行: 该图由 10 条线组成,因此我重新整形以获得每个 x 值的区域限制。

limits = data.reshape(data.shape + (5, 2))

现在,对于 x 的特定值,数据如下所示:

limits[20] = array([[  5.65624197,   6.70331962],
                    [ 13.68248989,  14.77227669],
                    [ 15.50973796,  16.61491606],
                    [ 24.03948128,  25.14907398],
                    [ 26.41541777,  27.53475798]])

我想制作一个网格并遮盖如下区域

X, Y = np.meshgrid(xs, ys)
bool_array = np.zeros(Y.shape)
for j, y in enumerate(limits):
    for min_y, max_y in y:
        inds = np.where(np.logical_and(ys >= min_y, ys <= max_y))[0]
        bool_array[inds, j] = True

plt.imshow(bool_array[::-1]) (不知道为什么图要倒转)

结果

这确实是我正在寻找的数据,现在我可以使用 True 值来获取具有不同功能的点。

问题是这段代码很慢,我的数据集会变大。

我想找到一种更有效的方法来找到这个 "mask"。

我尝试了几种方法并最终得到了以下适用于我的简单案例的结果

low_bound = limits[:,:,0]
upp_bound = limits[:,:,1]

mask = np.any((low_bound[:,None,:] <= Y.T[:,:,None]) & ( Y.T[:,:,None] <= upp_bound[:,None,:]),axis=-1).T

我知道它看起来很难看。我所做的是引入一个额外的维度,随后我会在其中检查条件是否位于两个终点之间。最后,我使用 np.any.

折叠附加维度

我不知道它比你的代码快多少。但是,鉴于我不使用单个 for 循环,应该可以提高性能。

用你的数据检查代码,如果有问题告诉我。

编辑:

plt.imshow 使用

时在左下角绘制 (0,0)
plt.imshow(mask,origin='lower')