Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 得到中间值两边的两个数字_Python_List_Python 2.7_Numpy_Median - Fatal编程技术网

Python 得到中间值两边的两个数字

Python 得到中间值两边的两个数字,python,list,python-2.7,numpy,median,Python,List,Python 2.7,Numpy,Median,鉴于: 然后: 如果列表的大小x是奇数,我可以使用x[x.index(middle)-1]和x[x.index(middle)+1]来获取中间两边的两个数字。这在上述情况下不起作用,因为中位数不在x中。是否有标准方法可以处理偶数大小和奇数大小的列表 假设排序输入列表的长度为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

鉴于:

然后:


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

假设排序输入列表的长度为
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

如果输入列表未排序(比如
x=[1.23,3.45,4.1,2.0]
),那么您希望迭代并找到两个感兴趣的量(当然,这也适用于排序的输入)。大概是这样的:

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)
largestmallerthan中值=x[0]
最小最大比中值=x[len(x)-1]
对于x中的n:
如果(n<中间值)和(n>=最大值小于中间值):
最大值小于中值=n
如果(n>middle)和(n这些是您要寻找的:

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
根据定义,a是一个将样本分成两半的值

有限个数字列表的中位数可以通过排列所有 从最低值到最高值的观测值,并选取 中间的一个(例如,{3,3,5,9,11}的中位数是5) 偶数个观测值,则没有单一的中间值 中位数通常被定义为两个中间值的平均值 (中位数{3,5,7,9}为(5+7)/2=6)

所以,你需要

  • 然后,以某种方式确定哪些样本是“下半部分”,哪些是“上半部分”
  • 相应地,从子集中选择最大值和最小值
可能的办法包括:

  • 对整个列表进行排序(可能是为了提高效率),然后选择相应的元素。(O(N*log(N)))
  • 遍历列表,将元素分为“下”部分和“上”部分(实际上,你需要在每一步计算中位数以对下一个元素进行分类),并跟踪“边界”值(你仍然需要它们来计算中位数)(O(N))
    • 这就是工作原理()
因此,基本上,您需要的是(针对您的1-D案例修改链接源代码):

然后检索相应的元素


但是,请注意,如果您努力提高效率,那么。

要获得中值,您必须有一个排序列表,因此这是一个简单的数学问题,如果列表长度不均匀,您需要
中间点-1
中间点+1
,如果列表长度为偶数,则中值是两个中间数字的平均值,因此您需要t有两个中间数字

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

刚刚意识到,当奇数大小的列表中有相同的条目时,
.index()
方法本身会崩溃,因为它会错误地选择第一个匹配项。第一个元素大于中位数,而紧靠它之前的元素应该这样做,不是吗?“第一个大于中值的元素和紧靠它之前的元素”是目标本身:)呃,对不起。我看不出偶数和不偶数情况都需要这种情况。也许你能指定数组是排序的吗?它大大简化了问题。但是语句
med(list_uu2;)
计算算术平均值,而不是中位数,不是吗?@LetzerWille谢谢。对于
[1,2,3,4]
这样的列表,它返回
(1,2)
@LetzerWille我们就快到了……它现在对奇数大小的列表做了类似的操作,例如
选择中位数附近的([1,2,3,4,5])
给出
(2,3)
。注意:由于我使用的是2.7,我不得不用“
numpy.median
”替换
统计数据。median
,但我不认为这有什么区别。@Pyderman现在应该可以工作了。bisect函数是违反直觉的,但具有持久性:)@Pyderman bisect对排序输入有效。所以我已经完成了这个llPrices=sorted([…..并输出783.765。实际上我已经写了关于排序输入的内容。更好的是,我将在函数中输入排序。事实上,它们就是我要寻找的数字,欧比万。做得很好。
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
x[(len(x)-1)/2 - len(x)%2], x[len(x)/2 + len(x)%2]
if sz % 2 == 0:
    part = partition(a, ((sz // 2) - 1, sz // 2))
else:
    part = partition(a, (sz - 1) // 2)
def get_two(l):
    ln = len(l)
    half = ln // 2
    return x[half-1], x[half + ln % 2]