Как заменить понимание списка командой numpy? - PullRequest
1 голос
/ 28 мая 2019

Есть ли способ заменить следующее понимание списка 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]

Таким образом, основная идея заключается в создании массива, в котором фактические значения заменяются числом вхождений этого конкретного значения в массиве.

Я хочу выполнить этот расчет в пользовательской функции потери керас, которая, насколько мне известно, не работает с циклами или списками.

Ответы [ 3 ]

3 голосов
/ 28 мая 2019

Вам просто нужно проиндексировать результат из np.bincount с помощью a:

a = np.array([0, 1, 1, 1, 0, 3])
bins = np.bincount(a)
a_counts = bins[a]

print(a_counts)
# array([2, 3, 3, 3, 2, 1], dtype=int64)
0 голосов
/ 28 мая 2019

Если вы хотите избежать циклов, вы можете использовать библиотеку 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 голосов
/ 28 мая 2019

Или используйте collections.Counter:

from collections import Counter
l = [0, 1, 1, 1, 0, 3]
print(Counter(l))

Какие выходы:

Counter({1: 3, 0: 2, 3: 1})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...