2012-07-20 4 views
1

I 난수의 배열을 가진 배열의 요소를 변경 NumPy와. 나는 0.07의 확률을 기반으로 일부 요소 만 바꾸고 싶다. 현재 나는 모든 요소를 ​​반복하는 for 루프를 사용하여이 작업을 수행하고 있습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 문제의 배열이 a를 호출하면주어진 확률

답변

6

, 당신은 내가는이 값을 변경하는 방법을 을 모르는

a[numpy.random.rand(*a.shape) < 0.07] 

에 의해 그 값의 0.07의 평균 비율을 선택할 수 있습니다. 두 개를 곱하면됩니다.

a[numpy.random.rand(*a.shape) < 0.07] *= 2.0 
+0

멋진! 고맙습니다. 난 그냥 다른 임의의 값으로 변경하고 싶었어. 그건 내 for 루프보다 훨씬 낫다. – wot

+1

확률 * p *로 요소를 변경하고 "해당 값의 비율 * p *"를 변경하는 것과는 (개별적으로) 차이가 있음에 유의하십시오. 나는 표시된 코드가 전자를한다고 생각한다. –

+0

@tc 어떻게하면 후자를 성취 할 수 있습니까? – wot

2

Sven의 대답은 우아합니다. 그러나, 당신이 첫 번째 표현은 샘플링 방법을 많은 요소를 결정

n = numpy.random.binomial(len(a), 0.07) 
a[numpy.random.randint(0, len(a), size=n)] *= 2.0 

로 변경하려는 요소를 선택하는 것이 훨씬 빠르다 (N의 (a), 그러나 0.07 평균 0과 렌의 정수이다), 두 번째는 검색하려는 색인의 수를 정확하게 생성합니다. p는 1에 접근

a[numpy.random.rand(len(a)) < p] 

가 작아

에 차이를 (. 같은 색인을 여러 번받을 수 있다는 점에 유의)하지만 작은 페이지를 위해, 그것은 10의 인자 또는 수 있습니다 더.