2013-10-01 2 views
2

여러 개의 배열 (필자의 경우 3 : a1, a2, a3)이 있다고 가정합니다. 또한 무작위로 분포 된 숫자 배열이 하나 더 있습니다 (r). 그들은 모두 같은 길이입니다. 나는 그의 결합 배열 a을 구축하는 데 필요한 세 가지 초기, 우리가 조건 (3)와 a2[i]a3[i]을 조건 2 가져가 만족하면 a1, a2a3 그렇게 r[i] 만족 특정 조건 일 경우, 우리는 a1[i]a[i]으로 취하는 것이 세 가지 조건은 상호 배타적입니다.여러 개의 배열 중에서 하나의 배열을 만듭니다. 몬테 - 카를로 방법

I 작성한 이것 루프에 대해 : 여기

a = empty(len(r)) 
for i in range(len(r)): 
    if r[i] <= p1: 
     a[i] = a1[i] 
    if p1 < r[i] <= (p1 + p2): 
     a[i] = a2[i] 
    if r[i] > (p1 + p2): 
     a[i] = a3[i] 

조건 1, 2, 3이 각각 「if ...」후에 발현된다. p1p2은 숫자가 부여됩니다. 이것은 Monte-Carlo 시뮬레이션의 일부입니다 (배열 a1, a2a3도 주어진 분포를 갖는 임의의 숫자 임). 너무 느리다. 어떻게 든 그것을 벡터화 할 필요가 있지만, 어떻게 해야할지 모른다. 가장 좋은 방법은 무엇입니까? 감사합니다. 여러 조건에서 선택할 수 있습니다

+0

질문에 만족스럽게 대답하는 경우 대답을 '수락'으로 표시하십시오. – askewchan

답변

4

사용 numpy.select : 귀하의 경우

conds = [r <= p1, r <= (p1 + p2), r > (p1 + p2)] 
choices = [a1, a2, a3] 
a = np.select(conds, choices) 

가, 세 번째 조건이 실제로 True가 어떤 조건이 될 수있다 (예를 들어, r == r).

+0

작은 배열의 경우 루프가 빠를 것이지만 루프 메서드가 너무 느리고 벡터화하는 방법을 묻는 질문을하면 큰 배열을 사용하고있는 것 같아요. 10,000 개 이상의 배열로 이루어진 테스트에서, numpy.select는 명시 적 루프보다 20 ~ 30 배 더 빠릅니다. – bogatron

관련 문제