楼主:
sma1033 (死马)
2018-06-14 00:24:38※ 引述《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都一样会慢
楼主:
sma1033 (死马)
2018-06-14 00:36:00看有没有人知道mask 3元运算值的写法,可以再少一行 XD
作者:
bibo9901 (function(){})()
2018-06-14 02:39:00应该不用multiply, 直接 A[mask<0.1] = 0 就可以了A[np.random.random((row, col)) < 0.1] = 0
楼主:
sma1033 (死马)
2018-06-14 03:27:00A[np.random.random((A.shape[0],A.shape[1]))<0.1]=0bibo的方法应该是最简洁的方式,推一个
作者:
bibo9901 (function(){})()
2018-06-14 08:39:00要这样的话直接 A[np.random.random(A.shape)<0.1]=0
作者:
NMOSFET (NMOSFET)
2018-06-14 10:59:00太感谢了! 谢谢楼上两位大大的帮忙!
b大的index是不是该改成`prb<0.1`而不是`mask<0.1`?
np.random.binomial(1, 0.9, (row,col))