假设:
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
中不存在中位数。是否有标准方法可以处理偶数大小和奇数大小的列表?
答案 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 - 1
和halfway 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
然后largestSmallerThanMedian
和smallestLargerThanMedian
会有两个感兴趣的数量。
答案 4 :(得分:1)
根据定义,median是一个将样本分为两半的值。
通过安排所有数字,可以找到有限数字列表的中位数 观察从最低值到最高值并选择 中间的(例如,{3,3,5,9,11}的中值是5)。如果有的话 偶数观察,则没有单一的中间值;该 然后通常将中值定义为两个中间值的平均值 ({3,5,7,9}的中位数是(5 + 7)/ 2 = 6)。
所以,你需要
可能的方法包括:
所以,基本上,你需要的是(改变你的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)