从 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')
我已经计算出我想要采样点的边界。
例如,一个数据集如下所示:
现在我想在红色区域中找到点,我通过以下方式进行: 该图由 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')