Re: [問題] numpy broadcasting 的使用

看板Python作者 (死馬)時間7年前 (2018/06/14 00:24), 7年前編輯推噓3(306)
留言9則, 5人參與, 7年前最新討論串2/3 (看更多)
※ 引述《NMOSFET (NMOSFET)》之銘言: : 各位大大好,小的最近遇到一個問題, : 假設有個 numpy 二維矩陣 A, : 我想要讓 A 矩陣裡的值, : 以 10% 的機率設為 0, : 於是寫了以下程式碼 : : rows = 10 : cols = 10 : prb = np.random.random((rows, cols)) : mask = prb<0.1 : for row in range(rows): : for col in range(cols): : if(mask[row][col]): : A[row][col]=0 : 有沒有能夠利用numpy的broadcasting來達到同樣的效果, : 而不是用 for 迴圈,因為上面這種寫法, : 我只要在if()裡面產生隨機數判斷就好, : 不用在上面宣告 prb 和 mask 來多此一舉, : 能否請各位大大幫我解惑,感恩!! 用for迴圈在這邊根本脫褲子放屁 如果是我的話,會用以下作法 mask = np.random.random((row, col)) mask[prb<0.1] = 0 mask[prb>=0.1] = 1 A = np.multiply(A, mask) done. 速度要快就是要用矩陣同時處理多element(可以平行算) 如果你用for迴圈一個一個element依序處理A當中的資料 不管你用什麼方法生成random都一樣會慢 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.188.20 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1528907083.A.5B5.html

06/14 00:36, 7年前 , 1F
看有沒有人知道mask 3元運算值的寫法,可以再少一行 XD
06/14 00:36, 1F
※ 編輯: sma1033 (61.231.188.20), 06/14/2018 00:45:05

06/14 02:39, 7年前 , 2F
應該不用multiply, 直接 A[mask<0.1] = 0 就可以了
06/14 02:39, 2F

06/14 02:39, 7年前 , 3F
A[np.random.random((row, col)) < 0.1] = 0
06/14 02:39, 3F

06/14 03:27, 7年前 , 4F
A[np.random.random((A.shape[0],A.shape[1]))<0.1]=0
06/14 03:27, 4F

06/14 03:27, 7年前 , 5F
bibo的方法應該是最簡潔的方式,推一個
06/14 03:27, 5F

06/14 08:39, 7年前 , 6F
要這樣的話直接 A[np.random.random(A.shape)<0.1]=0
06/14 08:39, 6F

06/14 10:59, 7年前 , 7F
太感謝了! 謝謝樓上兩位大大的幫忙!
06/14 10:59, 7F

06/14 12:11, 7年前 , 8F
b大的index是不是該改成`prb<0.1`而不是`mask<0.1`?
06/14 12:11, 8F

06/14 16:01, 7年前 , 9F
np.random.binomial(1, 0.9, (row,col))
06/14 16:01, 9F
文章代碼(AID): #1R8KLBMr (Python)
討論串 (同標題文章)
文章代碼(AID): #1R8KLBMr (Python)