亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 84 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號