Existe-t-il un moyen de remplacer la compréhension de liste python suivante par une fonction numpy qui ne fonctionne pas avec des boucles?
a = np.array([0, 1, 1, 1, 0, 3]) bins = np.bincount(a) >>> bins: [2 3 0 1] a_counts = [bins[val] for val in y_true] >>> a_counts: [2, 3, 3, 3, 2, 1]
L'idée de base est donc de générer un tableau où les valeurs réelles sont remplacés par le nombre d'occurrences de cette valeur spécifique dans le tableau.
Je veux faire ce calcul dans une fonction de perte de keras personnalisée qui, à ma connaissance, ne fonctionne pas avec des boucles ou des compréhensions de listes.
3 Réponses :
Ou utilisez collections.Counter:
Counter({1: 3, 0: 2, 3: 1})
Quelles sorties:
from collections import Counter l = [0, 1, 1, 1, 0, 3] print(Counter(l))
Il vous suffit d'indexer le résultat de np.bincount avec a:
print(a_counts) # array([2, 3, 3, 3, 2, 1], dtype=int64)
a = np.array([0, 1, 1, 1, 0, 3]) bins = np.bincount(a) a_counts = bins[a]
Petite question de suivi: j'ai essayé de faire la même chose dans keras en utilisant le backend tf avec les mêmes tableaux: python bins = k.tf.bincount (y_true) y_true_counts = bins [y_true] Malheureusement, j'obtiens ce qui suit erreur: la forme doit être de rang 1 mais est de rang 2 pour 'strided_slice_10' (op: 'StridedSlice') avec les formes d'entrée: [?], [1,6], [1,6], [1].
Si vous voulez éviter les boucles, vous pouvez utiliser la bibliothèque pandas :
import pandas as pd import numpy as np a = np.array([0, 1, 1, 1, 0, 3]) a_counts = pd.value_counts(a)[a].values >>> a_counts: array([2, 3, 3, 3, 2, 1], dtype=int64)