我可以通过12次比较找到中位数.但我想知道比较的最小数量以及如何进行比较.
在最近的微软采访中提出了以下问题
给出一个大小为5的未排序数组.找到中位数需要多少次最小比较?然后他扩大了它的大小n.
根据我的5个元素的解决方案是6
1) use 3 comparisons to arrange elements in array such that a[1]<a[2] , a[4]<a[5] and a[1]<a[4]
a) compare a[1] and a[2] and swap if necessary
b) compare a[4] and a[5] and swap if necessary
c) compare a[1] and a[4].if a[4] is smaller than a[1] , then swap a[1] wid a[4] and a[2] wid a[5]
2)if a[3]>a[2].if a[2]<a[4] median value = min(a[3],a[4]) else median value=min(a[2],a[5])
3)if a[3]<a[2].if a[3]>a[4] median value = min(a[3],a[5]) else median value=min(a[2],a[4])
Run Code Online (Sandbox Code Playgroud)
这可以扩展到n个元素.如果不是,除了quickselect之外,我们如何在O(n)中找到n个元素的中位数
我想只绘制两个数据集的中位数.它也可以在R中使用segment函数完成,但我不知道如何.所以,我决定使用boxplot功能,但仍然无法弄清楚如何隐藏所有内容并只显示中位数.
谢谢
我已经阅读了顺序统计信息,以便在线性时间O(n)中找到大小为n的数组中的第k个最小(或最大)元素.
找到中位数的中位数需要一步.
T(n)= T(n/5)+ O(n),我们可以得到T(n)= O(n).
但是,我们最终获得的数字不是中位数的中位数,而是中位数中位数的中位数中位数,如果我们有一个大数组.
请考虑一个包含125个元素的数组.
首先,它分为25个部分,我们找到25个中位数.然后,我们将这25个数字分成5个部分并找到5个中位数.最后,我们得到中位数中位数的中位数.(不是中位数的中位数)
我关心它的原因是,我可以理解,最多有大约3/4**n个元素比中位数的中位数小(或更大).但是,如果它不是中位数的中位数而是中位数的中位数呢?在更糟糕的情况下,必须有比枢轴更小(或更大)的元素,这意味着枢轴更接近阵列的边界.
如果我们有一个非常大的阵列,我们发现它的中位数中位数是中位数中位数的中位数.在最坏的情况下,我们发现的枢轴仍然非常接近边界,在这种情况下时间复杂度是多少?
我制作了125个元素的数据集.结果9?
0.8 0.9 1 inf inf
1.8 1.9 2 inf inf
6.8 6.9 7 inf inf
inf inf inf inf inf
inf inf inf inf inf
2.8 2.9 3 inf inf
3.8 3.9 4 inf inf
7.8 7.9 8 inf inf
inf inf inf inf inf
inf inf inf inf inf
4.8 4.9 5 inf inf
5.8 5.9 6 inf inf
8.8 8.9 9 inf inf …Run Code Online (Sandbox Code Playgroud) 我在这个论坛上看到了几个关于计算掩码数组中值的讨论,比如图像.我想要的是稍微更微妙,它是在我的图像上应用中值滤镜.我知道一种方法可以做到这一点,但速度太慢,并且会喜欢加速这个过程的方法.
例如,假设我有一个蒙版数组形状(10,10),我想应用一个带有框(3,3)的中值滤镜,而不使用那些被遮罩的元素.我的目标是用图像的每个像素中的值替换该框的掩蔽中值.
假设一个非常简单的情况,我们可以构建"图像"和掩码为:
im = numpy.random.uniform(size=(10,10))
mask = numpy.zeros_like(im)
mask[1:3,:] = 1
masked_im = numpy.ma.array(im, mask=mask)
Run Code Online (Sandbox Code Playgroud)
现在,为了实际制作中值滤波器,我们可以用蛮力的方式做到:
lx, ly = im.shape
side = 3
im_filt = numpy.zeros_like(im)
for jj in range(ly):
for ii in range(lx):
minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx])
miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly])
im_filt[ii,jj] = numpy.ma.median(masked_im[minx:maxx, miny:maxy])
Run Code Online (Sandbox Code Playgroud)
这解决了问题,并给出了一个很好的结果,但正如我所说,它是非常缓慢的.一个(对我来说,令人惊讶)稍微加快过程的方法是分别使用蒙版和图像,如:
im_filt2 = numpy.zeros_like(im)
for jj in range(ly):
for ii in range(lx):
minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx])
miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly])
zoom_im = im[minx:maxx, miny:maxy]
zoom_msk = mask[minx:maxx, …Run Code Online (Sandbox Code Playgroud) 嗨蟒蛇爱好者!
我目前正在研究用于研究目的的信号过滤,并决定使用SciPy.没什么特别的,只是日常工作的自动化.
所以,这是代码
from scipy.signal import medfilt
print(medfilt([2,6,5,4,0,3,5,7,9,2,0,1], 5))
Run Code Online (Sandbox Code Playgroud)
但问题是返回的序列计算错误
SciPy: [ 2. 4. 4. 4. 4. 4. 5. 5. 5. 2. 1. 0.]
Me : [ 5. 4.5 4. 4. 4. 4. 5. 5. 5. 2. 1.5 1.]
Run Code Online (Sandbox Code Playgroud)
似乎是,包的开发人员搞砸了一个细节.当孔径(SciPy中的内核)大于要分析的窗口时,还有另一个过滤规则.
例如,kernel=5过滤子序列的[2, 6, 5]中位数为5而不是2,因为SciPy计算的不是吗?同样地,如果kernel=5对于子序列[2,6,5,4]中位数是5和4,我们需要取它们之间的平均值,因此,中位数是4.5.
有人可以解释一下我在这种情况下得到了正确的结果吗?
我需要有效地计算Google BigQuery中数字序列的中值.有可能吗?
我想编写一个 C++ 函数来查找循环数据数组的中位数。例如,考虑指南针的读数,其中读数假定在 [0,360) 内。虽然 1 和 359 看起来很远,但由于读数的循环性质,它们非常接近。
求普通数据中 N 个元素的中位数如下。1. 对 N 个元素的数据进行排序(升序或降序) 2. 如果 N 为奇数,则中位数为排序数组中的第 (N+1)/2 个元素。3.如果N是偶数,中位数是排序数组中第N/2和第N/2+1个元素的平均值。
然而,循环数据中的环绕问题将问题带到了不同的维度,并且解决方案并不简单。
这里解释了从循环数据中查找平均值的类似问题如何计算一组循环数据的平均值? 上面链接中的建议是找到每个角度对应的单位向量并求平均值。然而,中位数需要对数据进行排序,而向量排序在这种情况下没有任何意义。因此,我认为我们不能使用提议的方案来找到中位数!
我有下表:
+------------+-------+
| SchoolName | Marks |
+------------+-------+
| A | 71 |
| A | 71 |
| A | 71 |
| B | 254 |
| B | 135 |
| B | 453 |
| B | 153 |
| C | 453 |
| C | 344 |
| C | 223 |
| B | 453 |
| D | 300 |
| D | 167 |
+------------+-------+
Run Code Online (Sandbox Code Playgroud)
这是按学校名称分组的平均分:
+------------+------------+
| SchoolName | avg(Marks) …Run Code Online (Sandbox Code Playgroud) 我正在努力寻找一个简单的中值问题的解决方案。my_table给定一个只有一列的表:
my_column |
----------|
10 |
20 |
30 |
40 |
50 |
60 |
Run Code Online (Sandbox Code Playgroud)
如何调用函数返回中位数 35?
当我只想返回中值时,我不知道如何使此语法起作用:
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER ( PARTITION BY my_column)
FROM
my_table
Run Code Online (Sandbox Code Playgroud)