Python agrupe por matriz a, y resuma la matriz b - Rendimiento

Dados dos arreglos desordenados de las mismas longitudes ayb:

a = [7,3,5,7,5,7]
b = [0.2,0.1,0.3,0.1,0.1,0.2]

Me gustaría agrupar por los elementos en un:

aResult = [7,3,5]

sumando los elementos en b (Ejemplo utilizado para resumir una función de densidad de probabilidad):

bResult = [0.2 + 0.1 + 0.2, 0.1, 0.3 + 0.1] = [0.5, 0.1, 0.4]

Alternativamente, aleatorio ayb en python:

import numpy as np
a = np.random.randint(1,10,10000)
b = np.array([1./len(a)]*len(a))

Tengo dos enfoques, que seguramente están lejos del límite inferior de rendimiento. Enfoque 1 (al menos agradable y breve): Tiempo: 0.769315958023

def approach_2(a,b):
    bResult = [sum(b[i == a]) for i in np.unique(a)]
    aResult = np.unique(a)

Approach 2 (numpy.groupby, horriblemente lento) Tiempo: 4.65299129486

def approach_2(a,b): 
    tmp = [(a[i],b[i]) for i in range(len(a))]
    tmp2 = np.array(tmp, dtype = [('a', float),('b', float)])
    tmp2 = np.sort(tmp2, order='a') 

    bResult = []
    aResult = []
    for key, group in groupby(tmp2, lambda x: x[0]):
        aResult.append(key)
        bResult.append(sum([i[1] for i in group]))

Update: Approach3, de Pablo. Hora: 1.0265750885

def approach_Pablo(a,b):    

    pdf = defaultdict(int); 
    for x,y in zip(a,b):
        pdf[x] += y  

Update: Enfoque 4, por Unutbu. Tiempo: 0.184849023819 [GANADOR HASTA AHORA, pero solo como entero]

def unique_Unutbu(a,b):

    x=np.bincount(a,weights=b)
    aResult = np.unique(a)
    bResult = x[aResult]

Quizás alguien encuentre una solución más inteligente para este problema que yo:)

Respuestas a la pregunta(3)

Su respuesta a la pregunta