Как рассчитать среднее значение для каждого из нижеперечисленных рабочих? Ниже приведен пример 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]
Вы можете использовать фрагментацию массива объявлений и функцию 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)}
Используя 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 последовательных измерения, должен быть относительно простой способ его векторизации