2016-10-15 6 views
1

다른 수준의 희소성이있는 행렬을 만들려고합니다. 데이터 행렬에서 0이 아닌 모든 값을 1로 변환하고 남은 항목을 0으로 변환하여이 작업을 수행하려고합니다.는 무작위로 파이썬을 사용하여 행렬에서 0이 아닌 값의 비율을 제어합니다.

다음 코드를 사용하여이를 수행 할 수있었습니다. 그러나 1의 백분율을 제어하여 최종 행렬에서 1을 무작위로 0으로 만들 수있는 방법을 확신하지 못합니다.

numpy.random.choice가

numpy.random.randint가 (2, 크기 = 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]] 

감사합니다!

+0

올바르게 이해하면 25 % 1의 배열이 있다고합시다. 그런 다음 20 % 1s라고 말하도록 수정하고 이미 설정된 1s에서 0s 만 사용 하시겠습니까? – Divakar

+0

@Divakar 네, 맞습니다. – Josephine

답변

0

당신은 같은 것을 할 수 -

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에서 N 임의로 선택된 인덱스를 선택 제로로 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 
관련 문제