Группировать по numpy.mean

1

Как рассчитать среднее значение для каждого из нижеперечисленных рабочих? Ниже приведен пример NumPy ndarray. Столбец 0 - рабочий, столбец 1 - широта, а столбец 2 - долгота.
Я хочу рассчитать среднюю широту и долготу для каждого рабочего. Я хочу сохранить все это с помощью NumPy (ndarray), не переходя в Pandas.

import numpy
from scipy.spatial.distance import cdist, euclidean
import itertools
from itertools import groupby

class WorkerPatientScores:

    '''
    I read from the Patient and Worker tables in SchedulingOptimization.
    '''
    def __init__(self, dist_weight=1):
        self.a = []

        self.a = ([[25302, 32.133598100000000, -94.395845200000000],
                   [25302, 32.145095132560200, -94.358041585705600],
                   [25302, 32.160400000000000, -94.330700000000000],
                   [25305, 32.133598100000000, -94.395845200000000],
                   [25305, 32.115095132560200, -94.358041585705600],
                   [25305, 32.110400000000000, -94.330700000000000],
                   [25326, 32.123598100000000, -94.395845200000000],
                   [25326, 32.125095132560200, -94.358041585705600],
                   [25326, 32.120400000000000, -94.330700000000000],
                   [25341, 32.173598100000000, -94.395845200000000],
                   [25341, 32.175095132560200, -94.358041585705600],
                   [25341, 32.170400000000000, -94.330700000000000],
                   [25376, 32.153598100000000, -94.395845200000000],
                   [25376, 32.155095132560200, -94.358041585705600],
                   [25376, 32.150400000000000, -94.330700000000000]])

        ndarray = numpy.array(self.a)
        ndlist = ndarray.tolist()
        geo_tuple = [(p[1], p[2]) for p in ndlist]
        nd1 = numpy.array(geo_tuple)
        mean_tuple = numpy.mean(nd1, 0)
        print(mean_tuple)

Вышеуказанный результат:

[32.14303108 -94.36152893]

Теги:
arrays
numpy
group-by

2 ответа

2
Лучший ответ

Вы можете использовать фрагментацию массива объявлений и функцию where для решения этой проблемы.

means = {}
for i in numpy.unique(a[:,0]):
    tmp = a[numpy.where(a[:,0] == i)]
    means[i] = (numpy.mean(tmp[:,1]), numpy.mean(tmp[:,2]))

Слайд [:,0] - удобный способ извлечь столбец (в этом случае первый) из массива 2d. Для того, чтобы получить средства, мы находим уникальные идентификаторы из первого столбца, то для каждого из них, мы извлечь соответствующие строки с, where и комбайном. Конечным результатом является бит кортежей, где ключи являются идентификаторами, а значения - кортежем, содержащим среднее значение двух других столбцов. Когда я запускаю его, он производит следующий dict:

{25302.0: (32.1463644108534, -94.36152892856853),
 25305.0: (32.11969774418673, -94.36152892856853),
 25326.0: (32.12303107752007, -94.36152892856853),
 25341.0: (32.17303107752007, -94.36152892856853),
 25376.0: (32.15303107752007, -94.36152892856853)}
  • 0
    Я люблю это решение!
1

Используя workerid и понимание списка, это будет:

a=np.array(self.a)
ids=np.unique(a[:,0]) #array of unique ids
pos_mean=[np.mean(a[a[:,0]==i, 1:], axis=0) for i in ids]

Но, учитывая, что всегда есть 3 последовательных измерения, должен быть относительно простой способ его векторизации

  • 0
    Потрясающие! Я смог добавить в WorkerId, изменив код выше: pos_mean = [(i, np.mean (a [a [:, 0] == i, 1:], axis = 0)) для i в идентификаторах] , Но как я могу удалить «массив» из вывода?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню