获取中间值

时间:2015-10-07 21:39:51

标签: python list python-2.7 numpy median

假设:

x = [1.23, 2.0, 3.45, 4.1]

然后:

middle = numpy.median(x)

如果列表x的大小是奇数,我可以使用x[x.index(middle)-1]x[x.index(middle)+1]来获取中间两侧的两个数字。这在上述情况下不起作用,因为x中不存在中位数。是否有标准方法可以处理偶数大小和奇数大小的列表?

6 个答案:

答案 0 :(得分:3)

假设已排序的输入列表的长度为N,那么在我看来,您需要访问元素N/2-1(N+1)/2(假设整数除法),即

[1.23, 2.0, 3.45, 4.1] => N = 4 thus N/2-1 = 1 and (N+1)/2 = 2

[1.23, 2.0, 3.45, 4.1, 5.6] => N = 5 thus N/2-1 = 1 and (N+1)/2 = 3

答案 1 :(得分:2)

这些是您正在寻找的numbers

x[(len(x)-1)/2 - len(x)%2], x[len(x)/2 + len(x)%2]

答案 2 :(得分:2)

要获得中位数,您必须有一个排序列表,这是一个简单的数学问题,如果列表长度不均匀,您需要halfway point - 1halfway point + 1,如果列表长度是偶数中位数是两个中间数的平均值所以你想要那两个中间数。

def get_two(l):
    ln = len(l)
    half = ln // 2
    return x[half-1], x[half + ln % 2]

答案 3 :(得分:1)

如果输入列表未排序(比如说x = [1.23, 3.45, 4.1, 2.0]),那么你想迭代并找到两个感兴趣的数量(这当然也适用于已排序的输入)。像这样:

largestSmallerThanMedian = x[0]
smallestLargerThanMedian = x[len(x)-1] 
for n in x:
    if (n < middle) and (n >= largestSmallerThanMedian):
        largestSmallerThanMedian = n
    if (n > middle) and (n <= smallestLargerThanMedian):
        smallestLargerThanMedian = n

然后largestSmallerThanMediansmallestLargerThanMedian会有两个感兴趣的数量。

答案 4 :(得分:1)

根据定义,median是一个将样本分为两半的值。

  

通过安排所有数字,可以找到有限数字列表的中位数   观察从最低值到最高值并选择   中间的(例如,{3,3,5,9,11}的中值是5)。如果有的话   偶数观察,则没有单一的中间值;该   然后通常将中值定义为两个中间值的平均值   ({3,5,7,9}的中位数是(5 + 7)/ 2 = 6)。

所以,你需要

  • 以某种方式确定哪些样品是&#34;下半部分&#34; &#34;上半部分&#34;,然后
  • 选择max&amp;因此,子集中的最小值。

可能的方法包括:

  • 对整个列表进行排序(可能就地提高效率),然后选择相应的元素。 (O(N *日志(N)))
  • 遍历列表,将元素排序为&#34; lower&#34;和&#34;鞋帮&#34;你去的部分(实际上,你需要计算每一步的中位数来对下一个元素进行分类)并跟踪你的边界&#34;值(你需要它们来计算中位数)(O(N))

所以,基本上,你需要的是(改变你的1-D案例链接来源的代码):

if sz % 2 == 0:
    part = partition(a, ((sz // 2) - 1, sz // 2))
else:
    part = partition(a, (sz - 1) // 2)

然后检索相应的元素。

但是,请注意,如果您追求效率,那就是there's quite an overhead converting data into ndarray

答案 5 :(得分:0)

您可以使用bisect模块:

x = [1.23, 2.0, 3.45, 4.1]  

 def select_near_median(list_):
    # gets two numbers either side of median
    # in a sorted list
    # bisect finds the index where median number
    # can be inserted
    import bisect
    import statistics
    list_ = sorted(list_)
    med = statistics.median(list_)
    ind = bisect.bisect_left(list_, med)
    if med == list_[ind]:
        left = ind
        right = left + 1
    else:
        left = ind - 1
        right = ind
    return list_[left], list_[right]


        print(select_near_median([1,2,3,4]))
        (2, 3)
        print(select_near_median([1,2,3,4,5]))
        (3, 4)
        print(select_near_med(x))
        (2.0, 3.45)