[英]randomly controlling the percentage of non zero values in a matrix using python
我希望创建具有不同稀疏程度的矩阵。 我打算通过将数据矩阵中非零的所有值转换为1来完成此操作,其余条目将为0。
我能够使用以下代码实现这一点。 但是我不知道如何能够在最终矩阵中随机地将1的0变为0,并控制1的百分比。
例如:
numpy.random.choice
numpy.random.randint(2,size = data_shape,p = [0.75,0.25])
使我们能够创建控制1的百分比的矩阵。 如何在最终矩阵中以类似的方式控制1的百分比?
import numpy as np
import scipy.sparse as sp
import numpy.ma as ma
indptr = np.array([0, 2, 3, 6])
indices = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
matrix = sp.csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
print(matrix)
mask = ma.masked_greater(matrix, 0)
print(mask)
print(mask.mask)
matrix2 = mask.mask
int_matrix = matrix2.astype(int)
print(int_matrix)
输出:
Data matrix:
[[1 0 2]
[0 0 3]
[4 5 6]]
Masked matrix:
[[-- 0 --]
[0 0 --]
[-- -- --]]
Masked values:
[[ True False True]
[False False True]
[ True True True]]
Final matrix
[[1 0 1]
[0 0 1]
[1 1 1]]
谢谢您的帮助!!!
你可以这样做 -
idx = np.flatnonzero(a)
N = np.count_nonzero(a!=0) - int(round(0.25*a.size))
np.put(a,np.random.choice(idx,size=N,replace=False),0)
样品运行
1)输入数组:
In [259]: a
Out[259]:
array([[0, 1, 0, 1, 1],
[0, 1, 1, 0, 1],
[1, 1, 0, 0, 0],
[1, 0, 1, 1, 0]])
2)获得非零指数:
In [260]: idx = np.flatnonzero(a)
3)获取要设置为零的非零数:
In [261]: N = np.count_nonzero(a!=0) - int(round(0.25*a.size))
4)最后,我们选择从IDXÑ随机选择的索引,并设置在那些a
为零:
In [262]: np.put(a,np.random.choice(idx,size=N,replace=False),0)
5)验证阵列 -
In [263]: a
Out[263]:
array([[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 1, 0]])
6)最后,我们看到非零的百分比并验证它是25%
:
In [264]: np.count_nonzero(a!=0)/float(a.size)
Out[264]: 0.25
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.