我已经计算了我想要采样点的边界。
例如,一个数据集看起来像:
现在我想在红色区域找到点,我用以下方式做: 该图由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
值来获取具有不同功能的点。
问题是这段代码非常慢,我的数据集会变得更大。
我想找到一种更有效的方法来找到这个&#34; mask&#34;。
答案 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')