我有兩個從影像加載的陣列,我需要添加這兩個影像,即如果中心有一個像素值為 1 的圓圈,我需要在左上角添加一個像素值為 2 的三角形。我要設定的規則是,如果 1 已經在該索引中,它只會將像素值 2 添加到空白像素(像素值為 0)
我怎么做?我一直在嘗試使用 np.add 和 where 選項
mask_test = master_array == 0
master_array = np.add(master_array, new_pic, where = mask_test)
但它一直在搞砸,master_array 最終只是 new_pic 而不是總和。網上搜索“哪里”是如何作業的一直沒有結果,因為每個人都沒有舉個例子,有些人甚至只是說“哦,它用得不多,所以我不會重復它”。
這段代碼:
master_array = np.add(master_array, new_pic, where = mask_test)
給了我這個:

但問題是當像素確實重疊時,我得到一個像素值 3 而不是它應該保留 1 的值。
uj5u.com熱心網友回復:
如檔案中所述,如果引數中的條件為假,out陣列將保留其“原始值” 。where這意味著out如果要設定where引數,您需要指定函式將輸出到的陣列。否則,該函式會嘗試從未初始化的陣列中獲取原始值,這會產生奇怪的結果。如果你很樂意覆寫master_array,你可以這樣做:
np.add(master_array, new_pic, out=master_array, where=master_array == 0)
(您不需要在這里分配回傳值 - 指定輸出陣列就足夠了。)
使用它可能不那么令人頭疼np.where:
master_array = np.where(master_array == 0, new_pic, 0)
但是由于您只是在主像素值為 0 的情況下添加,因此無需首先添加。您可以直接使用np.where而無需任何添加。
master_array = np.where(master_array == 0, new_pic, master_array)
uj5u.com熱心網友回復:
wherein (或其他 ufunc)的使用np.add并不常見——尤其是與np.where函式的使用相比。至少當我回答 SO 時,我強調out需要包括在內。
檔案在默認情況下談論“未初始化”值out=None。這可能不清楚,但實際上它意味著一個陣列,例如由np.empty.
這可能包含任何內容,例如:
In [263]: res = np.empty((5,5),int)
In [264]: res
Out[264]:
array([[ 50999536, 0, 140274438367024,
-6315338160082163841, 140273540789184],
[ 161, 55839504, 140274448227440,
140273575343728, 358094631352936090],
[ 140273564120384, 140273575343344, -7783537013977118542,
140273543024256, 140273575343200],
[-6522034781934541837, 140273620247296, 140273575343776,
1387433780369843801, 140273560270848],
[ 140273561761968, -3190833100527581043, 140273563628672,
140273561762640, 480]])
定義一個初始陣列:
In [265]: x1 = np.random.randint(0,5,(5,5))
In [266]: x1
Out[266]:
array([[3, 2, 0, 1, 3],
[3, 2, 4, 0, 3],
[2, 3, 3, 4, 3],
[3, 2, 0, 2, 2],
[1, 2, 1, 1, 2]])
In [267]: x2=x1.copy()
沒有out,我們得到的值很像res上面。只有x1==0元素設定為 10:
In [268]: np.add(x1, 10, where=x1==0)
Out[268]:
array([[51108864, 0, 10, 47780512, 51193856],
[51213024, 51245760, 51252528, 10, 51260336],
[51261168, 51261920, 51264176, 51298864, 51270656],
[51271040, 51274864, 10, 51276640, 51277024],
[51277808, 51278528, 51279104, 51284496, 51286448]])
或者我們可以設定out為np.zeros:
In [269]: np.add(x1, 10, where=x1==0, out=np.zeros((5,5),int))
Out[269]:
array([[ 0, 0, 10, 0, 0],
[ 0, 0, 0, 10, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 10, 0, 0],
[ 0, 0, 0, 0, 0]])
但是,如果我們將其設定為x1,或副本x1(這可能是您想要的):
In [270]: np.add(x1, 10, where=x1==0, out=x2)
Out[270]:
array([[ 3, 2, 10, 1, 3],
[ 3, 2, 4, 10, 3],
[ 2, 3, 3, 4, 3],
[ 3, 2, 10, 2, 2],
[ 1, 2, 1, 1, 2]])
但是我們可以對蒙面加法做同樣的事情:
In [271]: x1[x1==0] = 10
In [272]: x1
Out[272]:
array([[ 3, 2, 10, 1, 3],
[ 3, 2, 4, 10, 3],
[ 2, 3, 3, 4, 3],
[ 3, 2, 10, 2, 2],
[ 1, 2, 1, 1, 2]])
或者使用更常用的np.where功能:
In [273]: np.where(x1==10, 20, x1)
Out[273]:
array([[ 3, 2, 20, 1, 3],
[ 3, 2, 4, 20, 3],
[ 2, 3, 3, 4, 3],
[ 3, 2, 20, 2, 2],
[ 1, 2, 1, 1, 2]])
根據我對 SO 的經驗,where/out在某些值的評估可能會導致錯誤時最有用,例如除以 0 或負數對數。
在 np.where(A,B,C)中,對 3 個引數進行了完整評估,結果只是從 中選擇B并C基于A。使用np.add(x, y, where=A, out=C),x y僅在條件為真時才進行加法。評價是選擇性的。區別可能很難掌握,并且在使用時可能無關緊要np.add。
uj5u.com熱心網友回復:
你可以簡單地使用正常的加法:
mask_test = master_array == 0
master_array = new_pic * mask_test
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464602.html
