Y a-t-il un moyen net d'affecter des valeurs aux indices donnés dans une matrice et des valeurs moyennes dans des indices répétés?
Par exemple: et je souhaite affecter des valeurs dans la matrice B sur le tableau A dans les indices correspondants indiqués dans "IND", et un [1] doit être en moyenne de 2 et 3. p> Je peux essayer une boucle pour la boucle: p> mais ce code a l'air sale. Y a-t-il un meilleur moyen de faire le travail? P> p>
4 Réponses :
Vous pouvez le faire en utilisant NP.Where A >. In [5]: a
Out[5]: array([0. , 2.5, 4. , 5. , 0. ])
Voici une méthode vectorisée. La logique réelle est proche de votre propre solution.
n,d = (np.bincount(ind,x,a.size) for x in (b,None)) valid = d!=0 np.copyto(a,np.divide(n,d,where=valid),where=valid)
In [59]: a = np.zeros(5)
In [60]: a = np.zeros(5)
...: hit = np.zeros_like(a)
...: np.add.at(a,ind,b)
...: np.add.at(hit,ind,1)
In [61]: a
Out[61]: array([0., 5., 4., 5., 0.])
In [62]: hit
Out[62]: array([0., 2., 1., 1., 0.])
Cela pourrait ne pas être nécessairement plus propre ou plus rapide, mais voici une alternative que je pense est facile à lire:
a = [[] for _ in range(5)]
for i, x in zip(ind, b):
a[i].append(x)
[np.mean(x) if len(x) else 0 for x in a]