簡體   English   中英

使用python隨機控制矩陣中非零值的百分比

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM