Вычислить средние значения массива с определенными элементами

Я реализую алгоритм классификации ближайших центроидов, и я как бы заблокирован тем, как использовать numpy.mean в моем случае.

Предположим, у меня есть наборы сферических данных Икс:

[[ 0.39151059  3.48203037]
 [-0.68677876  1.45377717]
 [ 2.30803493  4.19341503]
 [ 0.50395297  2.87076658]
 [ 0.06677012  3.23265678]
 [-0.24135103  3.78044279]
 [-0.05660036  2.37695381]
 [ 0.74210998 -3.2654815 ]
 [ 0.05815341 -2.41905942]
 [ 0.72126958 -1.71081388]
 [ 1.03581142 -4.09666955]
 [ 0.23209714 -1.86675298]
 [-0.49136284 -1.55736028]
 [ 0.00654881 -2.22505305]]]

и помеченный вектор Д:

[0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1.]

Пример со 100 точками данных 2D дает следующий результат: enter image description here

Алгоритм NCC состоит из первого вычисления среднего класса для каждого класса (0 и 1: это синий и красный), а затем вычисления ближайшего центроида класса для следующей точки данных.

Это моя текущая функция:

def mean_ncc(X,Y):
    # find unique classes
    m_cids = np.unique(Y)   #[0. 1.]
    # compute class means
    mu = np.zeros((len(cids), X.shape[1]))    #[[0. 0.] [0. 0.]] (in the case where Y has 2 unique points (0 and 1)
    for class_idx, class_label in enumerate(cids):
        mu[class_idx, :] = #problem here
    return mu

Итак, здесь мне нужен массив, содержащий средние значения класса «0» (синие) точки и «1» (красные) точки: Как я могу указать количество элементов X, среднее значение которых я хочу вычислить? Я хотел бы сделать что-то вроде этого:

for class_idx, class_label in enumerate(m_cids):
       mu[class_idx, :] = np.mean(X[only the elements,that contains the same class_label], axis=0)
   

Возможно ли это или есть другой способ реализовать это?

Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать что-то вроде этого:

import numpy as np

tags = [0, 0, 1, 1, 0, 1]
values = [5, 4, 2, 5, 9, 8]

tags_np = np.array(tags)
values_np = np.array(values)

print(values_np[tags_np == 1].mean())

Обновлено: вам обязательно нужно будет больше изучить параметр оси для средней функции:

import numpy as np

values = [[5, 4],
            [5, 4],
            [4, 3],
            [4, 3]]

values_np = np.array(values)
tags_np = np.array([0, 0, 1, 1])

print(values_np[tags_np == 0].mean(axis=0))

Другие вопросы по теме