2017-10-05 1 views
0

J'ai deux tableaux, aaa représente l'indice de ligne de la matrice ref et bbb représente les valeurs à remplir en ref.Remplir la matrice à la même position en faisant la moyenne de chaque entrée au lieu de la remplacer par la dernière entrée?

ref = np.zeros(shape=(4,2)) 
aaa = np.array([1,1,2,1,3]) # row index 
bbb = np.array([1,9,2,5,3]) # value 

# At column 0; row 1, fill 1. row 1, fill 9. row 2, fill 2. row 1, fill 5. row 3, fill 3. 
ref[aaa,0] = bbb 

print ref 
>>[[ 0. 0.] 
[ 5. 0.] 
[ 2. 0.] 
[ 3. 0.]] 

Pour l'index de ligne 1, il dispose de 3 valeurs 1, 9 et 5. Je veux la moyenne d'entre eux en tant que (1 + 9 + 5)/3 = 15 au lieu de remplir par le dernier 5. Je pense à np.append() chacun d'eux et np.mean() à la fin.

ref[aaa,0] = [ref[aaa,0]].append(bbb) 

Mais cette méthode renvoie nan.

Ou

ccc = np.array([]) 
ref[aaa,0] = np.append(ccc, bbb) 

L'une des lignes est encore 5 de cette façon. Comment est-ce que je peux employer np.append() ici ou est-ce n'importe quel autre moyen rapide d'obtenir la moyenne au lieu de remplacer?

+0

Pour votre information '[] .append (bbb)' ne fonctionne pas comme prévu que '.append()' modifie '[]' mais ne * renvoie * pas quelque chose. Aussi n'a pas vraiment de sens; pourquoi voudriez-vous '[] .append (stuff)' au lieu de simplement l'insérer dans une autre liste avec '[bbb]'? –

Répondre

1

Vous pouvez faire une agrégation basée sur aaa d'abord et ensuite affecter les valeurs agrégées à ref, quelque chose comme ci-dessous:

def avg_by_group(aaa, bbb): 
    idx = np.argsort(aaa) 
    aaa_sort = aaa[idx] 
    bbb_sort = bbb[idx] 
    diff_idx = np.flatnonzero(np.ediff1d(aaa_sort, to_begin=-1)) 
    group_sizes = np.diff(np.concatenate((diff_idx, [aaa.size]))) 
    avg = np.add.reduceat(bbb_sort, diff_idx)/group_sizes 
    return aaa_sort[diff_idx], avg 

idx, avg = avg_by_group(aaa, bbb) 
ref[idx, 0] = avg 
ref 

#array([[ 0., 0.], 
#  [ 5., 0.], 
#  [ 2., 0.], 
#  [ 3., 0.]])