Re: [问题] numpy broadcasting 的使用

楼主: sma1033 (死马)   2018-06-15 18:58:00
延续之前的问题,想延伸问一个相关的问题
目前看起来若要把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都一样会慢
作者: ThxThx (洗洗睡)   2018-06-15 19:13:00
https://i.imgur.com/jmBjado.png缺点:100 / (机率) 要是整数
楼主: sma1033 (死马)   2018-06-15 19:20:00
感谢ThxThx解答,如果还有其他方法也欢迎提出讨论
作者: GeoMeTric ( )   2018-06-16 08:57:00
将 0.1 取代为随机数的 10th percentile,如A = np.where(prb < np.percentile(prb, 10), 0, A)
作者: iphone2003 (307)   2018-06-16 13:43:00
index = np.random.choice(np.prod(A.shape), int(np.prod(A.shape) * 0.1)A.ravel()[index] = 0
楼主: sma1033 (死马)   2018-06-18 18:47:00
感谢楼上热心网友的回复,小弟又多学了好几招~

Links booklink

Contact Us: admin [ a t ] ucptt.com