从1D图形到2D蒙版

时间:2015-04-17 08:29:54

标签: python numpy matplotlib scipy

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

例如,一个数据集看起来像: enter image description here

现在我想在红色区域找到点,我用以下方式做: 该图由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]) (不知道为什么图形需要反转)

结果

enter image description here

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

问题是这段代码非常慢,我的数据集会变得更大。

我想找到一种更有效的方法来找到这个&#34; mask&#34;。

1 个答案:

答案 0 :(得分:2)

我尝试了几件事,最后得到了以下结果,这些结果适用于我的简单案例

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