donné deux matrices non commandées de mêmes longueurs A et B:
def unique_Unutbu(a,b): x=np.bincount(a,weights=b) aResult = np.unique(a) bResult = x[aResult]
3 Réponses :
Que diriez-vous de cette approche:
aResult = pdf.keys() bResult = pdf.values()
Vous pouvez utiliser defaultDict (int), c'est plus propre.
Merci! Je ne le savais pas. Réponse mise à jour :)
J'aime l'approche, c'est joli. Malheureusement, il semble être plus lent que «Approche 1» surtout pour de longs tableaux ...
@HELGA: J'ai réécrit la mise en œuvre de Pablo en Cython en utilisant Unorded_map CODE> a>. ~ 10-30 fois plus vite.
si un problème potentiel avec l'utilisation de donc EDIT: voir < a href = "https://stackoverflow.com/questions/7538382/python-group-by-array-a-and-summarize-Array-b-performance/7539307#7539307"> JF Stabilite de Sebastian pour une solution autour de la restriction des valeurs entière et des gros valeurs. P> p> a code> est composé d'intens <2 ** 31-1 (c'est-à-dire si
a code> a des valeurs pouvant correspondre dans dtype
int32 code >), alors vous pouvez utiliser
np.bincount code> avec des poids:
np.unique (a) code> retourne
[3 5 7] code>, le résultat apparaît donc dans une commande différente: p>
np.bincount code> est-ce qu'il est Retourne un tableau dont la longueur est égale à la valeur maximale dans
A code>. Si
A code> contient même un élément de valeur près de 2 * 31 31-1, alors
bincount code> devrait allouer une matrice de taille
8 * (2 ** 31 -1) code> octets (ou 16 gib). P>
np.bincount code> peut être la solution la plus rapide pour les tableaux
A code> qui ont une grande longueur , mais pas de gros valeurs. Pour les tableaux
A code> qui ont une petite longueur (et de grosses valeurs), à l'aide d'un
collections.defaultdict code> serait probablement plus rapide. P>
Mesures Show NP.Bincount () CODE> Effectue même contre Solutions à base de Crython .
APPROCHE D'ICI SIMPRIMÉS DE @ Unutbu's One :
import numpy as np def f(a, b): result_a, inv_ndx = np.unique(a, return_inverse=True) result_b = np.bincount(inv_ndx, weights=b) return result_a, result_b
Je voulais dire que vous ne pouvez pas supposer que la liste A est triée.