为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中使用 2D 蒙版从 (x,y) 字段中高效选择元素

在 Python 中使用 2D 蒙版从 (x,y) 字段中高效选择元素

慕勒3428872 2022-09-20 16:38:57
我有一个大的 2D 位置数据字段,以两个数组的形式给出,其中 .我想返回索引数组,该数组被一个名为 的 N x N 数组掩蔽。那是。该数组仅由 s 和 s 组成。xylen(x) == len(y)idx_masked(x[idx_masked], y[idx_masked])intmaskmask[x[idx_masked], y[idx_masked]] == 1mask01我想出了以下解决方案,但它(特别是下面的最后一行)非常慢,因为我有N x N = 5000 x 5000,重复1000次:import numpy as npimport matplotlib.pyplot as plt# example mask of one corner of a squareN = 100mask = np.zeros((N, N))mask[0:10, 0:10] = 1# example x and y position arrays in arbitrary unitsx = np.random.uniform(0, 1, 1000)y = np.random.uniform(0, 1, 1000)x_bins = np.linspace(np.min(x), np.max(x), N)y_bins = np.linspace(np.min(y), np.max(y), N)x_bin_idx = np.digitize(x, x_bins)y_bin_idx = np.digitize(y, y_bins)idx_masked = np.ravel(np.where(mask[y_bin_idx - 1, x_bin_idx - 1] == 1))plt.imshow(mask[::-1, :])plt.scatter(x, y, color='red') plt.scatter(x[idx_masked], y[idx_masked], color='blue')有没有更有效的方法来做到这一点?
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

假设您的字段覆盖了相同大小的条柱,则无需显式定义条柱。 可以从简单的楼层划分确定每个位置,因为您知道每个箱子的大小。我建议使用总宽度(您传入的内容),而不是,如果您当然知道范围的预期大小。mask*_bin_idx1 / N1 - 0np.random.uniformx.max() - x.min()


x0 = 0   # or x.min()

x1 = 1   # or x.max()

x_bin = (x1 - x0) / N

x_bin_idx = ((x - x0) // x_bin).astype(int)


# ditto for y

这将比数字化更快,更简单,并且可以避免在开始时出现额外的箱子。


对于大多数目的,您不需要 。90%的问题(包括这个问题)不应该使用。如果您想要一种快速访问 和 的必要元素的方法,只需使用布尔掩码即可。面具很简单np.wherewherexy


selction = mask[x_bin_idx, y_bin_idx].astype(bool)

如果已经是布尔值(无论如何都应该是布尔值),则表达式就足够了。它会产生一个大小与 和 相同(与 和 大小相同的)数组,其中包含每个点的掩码值。您可以将面罩用作maskmask[x_bin_idx, y_bin_idx]x_bin_idxy_bin_idxxy


x[selection]   # Elements of x in mask

y[selection]   # Elements of y in mask

如果你绝对需要整数索引,那么门槛不是你最好的选择。where


indices = np.flatnonzero(selection)


indices = selection.nonzero()[0]

如果您的目标只是从 中提取值,我建议将它们堆叠到单个数组中:xy


coords = np.stack((x, y), axis=1)

这样,您不必应用索引两次,只需提取值即可


coords[selection, :]


coords[indices, :]

根据 和 的相对密度,布尔掩码或线性索引可能更快。你将不得不对一些相关的案例进行计时,以获得更好的直觉。maskxy


查看完整回答
反对 回复 2022-09-20
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信