2014-05-22 5 views
1

두 개의 1D Numpy 배열 index_datacharge이 있는데 길이는 같고 int와 float가 각각 들어 있습니다. 나는 다음과 같이 total_charge 배열을 만들려고 노력하고 있어요 :Numpy를 사용하여 벡터화 루프를 벡터화

total_charge = [] 
for i in range(len(index_data)): 
    if index_data[i] == 0: 
     total_charge.append(charge[i]) 
    else: 
     total_charge[-1] += charge[i] 
total_charge = np.array(total_charge) 

내가 이것을 벡터화 것 어떻게? 나 좀 도와 줘 마법사, 너는 내 유일한 희망이야.

+0

나는 이것이 매우 쉽게 벡터화에 도움이된다고 생각하지 않습니다 ... – mgilson

+1

스 톡 (Spock)의 스타 워즈 참조? 아니, 그건 옳지 않아. :) –

답변

4

index_datacharge의 구체적인 예는 예상 입력을 명확하게하는 데 도움이됩니다. 그러나 가지고있는 것을 읽는 것으로부터, 나는 np.add.reduceat을 사용할 수 있다고 생각합니다.

각 새로운 요금 그룹은 0 (index_data)으로 표시됩니다. 그렇지 않은 경우 index_data의 값은 사용되지 않습니다. total_charge은 각 그룹의 비용 합계입니다.

다음은 reduceat의 사용 예입니다.

먼저 데모 일부 데이터 :

In [107]: zerolocs = where(index_data==0)[0] 

In [108]: zerolocs 
Out[108]: array([0, 3, 7]) 

사용 np.add.reduceat는 대전기를 합계 :

In [105]: index_data 
Out[105]: array([0, 1, 1, 0, 1, 1, 1, 0, 1]) 

In [106]: charge 
Out[106]: array([ 1.5, 2. , 3. , 2.5, 1.5, 1. , 1. , 2. , 1. ]) 

zerolocs0index_data가 발생 지표를 제공한다.

In [109]: total_charge = np.add.reduceat(charge, zerolocs) 

In [110]: total_charge 
Out[110]: array([ 6.5, 6. , 3. ]) 
+0

당신은 기적의 일꾼입니다. 나는 원했던 것과 똑같이 할 수있는 다소 불명확 한 Numpy 기능이 있다는 것을 알았고, 나는 어느 것을 알지 못했다. 그리고 우리, Trekkies는 여전히 Star Wars를 감상 할 수 있습니다. –