2017-04-05 1 views
1

에 값을 뺍 :반복적으로 같은 간단한 NumPy와 배열에서 시작 배열

a = np.array([1,1,0,2,1,0]) 

내 목표는 반복적으로 특정 임계 값까지이의 값을 빼기하는 것입니다. 예를 들어, 사용자 수를 포함하여 a을 생각해보십시오. 이 경우 5 사용자가 함께 배포됩니다 유지

d = a/a.sum() 

가 지금은 초기 유통까지의 시간에서 4 사용자를 빼야 할 항상 결과 배열에> 0 값. (단일 실행에서)를 생성

b = np.random.multinomial(4,d) 

: 내가 함께 뺄 임의의 배열을 만들 수 있습니다 a-b 같은 결과가 초래

array([0, 1, 0, 3, 0, 0]) 

:

array([ 1, 0, 0, -1, 1, 0]) 

어떻게 할 수 생성 된 배열은 결과로 (a-b) 연산에서 음수 값을 생성하지 않습니다. 지금까지 나는 무작위 분포를 생성, 다른 측면에서 일을에서 생각 : 사용자 d의 초기 분포에 따라

r = np.random.multinomial(total users - deleted users,d) 

을,하지만 난 벡터에 대한 몇 가지 통계를 적용해야하기 때문에, 결과는 다를 수 있습니다 후자의 접근법에서. 당신이 무작위로 부정되고 a의 요소없이 n에 의해 a.sum()을 감소하려면

+2

그냥 할 수 없어'np.maximum (AB, 0) '? 결과에서 음이 아닌 값을 보장하려면? – EdChum

+0

@EdChum에 감사 드려요.하지만이 경우 사용자를 "잃어 버렸을"것입니다. 아이디어는'(a-b)> 0' 인 경우에만 'a'로 뺄셈 값으로 들어가는 배열'b'를 만드는 것입니다. –

+1

'np.where ((ab)> 0, ab, a)' – EdChum

답변

1

이 그것을 할 한 가지 방법입니다 :

def rnd_decrement(a, n): 
    c = np.cumsum(np.r_[0, a]) 
    if n < c[-1]: 
     r = np.random.choice(np.arange(c[-1]) + 1, n, replace = False) 
     d = np.sum(r[:,None] <= c[None,:], axis=0) 
     return np.diff(c-d) 
    else: 
     return np.zeros_like(a)