1
votes

Comment remplacer une compréhension de liste par une commande numpy?

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.


0 commentaires

3 Réponses :


0
votes

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))


0 commentaires

3
votes

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]


1 commentaires

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].



0
votes

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)


0 commentaires