如果我有一個包含 100 個元素的陣列a,我想有條件地更新。我有第一個掩碼,它選擇將嘗試更新m的元素。a在a[m](例如,50 個元素)中,我想更新一些元素的子集,但留下其他元素。所以第二個掩碼m2有50=m.sum()元素,其中只有一些是True.
為了完整起見,一個最小的例子:
a = np.random.random(size=100)
m = a > 0
m2 = np.random.random(size=m.sum()) < 0
newvalues = -np.random.randint(size=m2.sum())
那么如果我要做
a[m][m2] = newvalues
這不會改變 a 的值,因為花哨的索引a[m]會在此處復制。使用索引 (with where) 具有相同的行為。
相反,這有效:
m12 = m.copy()
m12[m] = m2
a[m12] = newvalues
但是,這是冗長且難以閱讀的。
有沒有更優雅的方法來更新陣列子集的子集?
uj5u.com熱心網友回復:
您可以先計算感興趣的“最終索引”,然后使用這些索引進行更新。以更“numpy”的方式實作此目的的一種方法是屏蔽第一個索引陣列,該索引陣列是基于第一個掩碼陣列計算的。
final_mask = np.where(m)[0][m2]
a[final_mask] = newvalues
uj5u.com熱心網友回復:
首先計算要更新的元素的索引:
indices = np.array(range(100))
indices = indices[m1][m2]
然后用于indices更新陣列a:
a[indices] = newvalue
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/436266.html
上一篇:使用?的文本檔案中的最大數
