作者sma1033 (死马)
看板Python
标题Re: [问题] numpy broadcasting 的使用
时间Fri Jun 15 18:58:00 2018
延续之前的问题,想延伸问一个相关的问题
目前看起来若要把A矩阵当中的element以10%的机率设为零的方法是
=> A[np.random.normal(A.shape)<0.1] = 0
但是这个方法无法确保每次A当中被设为0的元素的总数目是一样的
假如我想要让
"A当中位置随机,但数量占A当中总数量为10%的元素被设为0"的话该怎麽做最好?
我目前知道的方法为以下:
element_idx = list(range(np.prod(A.shape)))
np.shuffle(element_idx)
ary_idx = np.array(element_idx).reshape(A.shape)
A[ary_idx < np.prod(A.shape)*0.1] = 0
请问各位版友有更快或更简洁的方法吗?
感谢大家~
※ 引述《sma1033 (死马)》之铭言:
: ※ 引述《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), 来自: 118.160.86.55
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1529060285.A.DFA.html
2F:→ ThxThx: 缺点:100 / (机率) 要是整数 06/15 19:15
3F:→ sma1033: 感谢ThxThx解答,如果还有其他方法也欢迎提出讨论 06/15 19:20
4F:→ GeoMeTric: 将 0.1 取代为随机数的 10th percentile,如 06/16 08:57
5F:→ GeoMeTric: A = np.where(prb < np.percentile(prb, 10), 0, A) 06/16 08:57
6F:推 iphone2003: index = np.random.choice(np.prod(A.shape), int(np. 06/16 13:43
7F:→ iphone2003: prod(A.shape) * 0.1) 06/16 13:43
8F:→ iphone2003: A.ravel()[index] = 0 06/16 13:43
9F:→ sma1033: 感谢楼上热心网友的回覆,小弟又多学了好几招~ 06/18 18:47