猿问

通过numpy.mean分组

如何计算下面每个工人的均值?以下是我的示例NumPy ndarray。第0列是工作人员编号,第1列是纬度,第2列是经度。

我想计算每个workerid的平均纬度和经度。我想保留所有使用NumPy(ndarray),而不转换为熊猫。


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]


犯罪嫌疑人X
浏览 335回答 2
2回答

30秒到达战场

您可以使用一些创造性的数组切片和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数组中提取列(在本例中为第一列)的便捷方法。为了获得均值,我们从第一列中找到唯一的ID,然后针对每个ID,使用提取相应的行where,然后合并。最终结果是元组的字典,其中键是ID,值是包含其他两列平均值的元组。当我运行它时,它会产生以下命令:{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 idspos_mean=[np.mean(a[a[:,0]==i, 1:], axis=0) for i in ids]但是考虑到似乎总是有3次连续测量,应该有一个相对简单的方法对其进行矢量化
随时随地看视频慕课网APP

相关分类

Python
我要回答