Есть ли способ заменить следующее понимание списка python на функцию numpy, которая не работает с циклами?
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]
Итак, основная идея состоит в том, чтобы сгенерировать массив, в котором фактические значения заменяются количеством вхождений этого конкретного значения в массив.
Я хочу сделать этот расчет в пользовательской функции потери keras, которая, насколько мне известно, не работает с циклами или списками.
Или используйте collections.Counter
:
from collections import Counter
l = [0, 1, 1, 1, 0, 3]
print(Counter(l))
Какие выходы:
Counter({1: 3, 0: 2, 3: 1})
Если вы хотите избежать циклов, вы можете использовать библиотеку 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)
Небольшой дополнительный вопрос: я пытался сделать то же самое в keras, используя бэкэнд tf с теми же массивами:
python bins = k.tf.bincount(y_true) y_true_counts = bins[y_true]
К сожалению, я получаю следующую ошибку: Форма должна иметь ранг 1, но ранг 2 для «strided_slice_10» (op: «StridedSlice») с входные формы: [?], [1,6], [1,6], [1].