[英]how does numpy find the median in an array/list?
我讀到,numpy 使用 introselect 在數組/列表中查找中位數( https://www.researchgate.net/publication/303755458_Fast_Deterministic_Selection )[第 2 頁; 最后 5 行]。 但我在 numpy 源代碼中找不到任何提示: https://github.com/numpy/numpy/blob/v1.19.0/numpy/lib/function_base.py#L3438-L3525
有誰知道我在哪里可以找到 introselect 的 numpy 實現? 或者如果 numpy 不使用 introselect,那么使用什么樣的算法來找到中位數?
提前謝謝了:)
在第 3528 行似乎是主要的中位數 function。 如果我們去掉所有多維和 nan 的東西,我們會得到類似的東西
def _median(a, axis=None, out=None, overwrite_input=False):
# can't be reasonably be implemented in terms of percentile as we have to
# call mean to not break astropy
# Set the partition indexes
sz = a.shape
if sz % 2 == 0:
szh = sz // 2
kth = [szh - 1, szh]
else:
kth = [(sz - 1) // 2]
part = partition(a, kth, axis=None)
return mean(part[indexer], axis=None, out=out)
所以分區正在做所有的工作並且來自
from numpy.core.fromnumeric import (
ravel, nonzero, partition, mean, any, sum
)
如果我們從 go 到 numpy 代碼,我們將得到以下C 代碼。
NPY_SELECTKIND sortkind = NPY_INTROSELECT;
和
val = PyArray_Partition(self, ktharray, axis, sortkind);
在這里實現並使用
mid = ll + median_of_median5_@suff@(v + ll, hh - ll, NULL, NULL);
所以它是introselect。
一旦達到遞歸深度的兩倍,算法就會更改為使用中位數的中位數5,直到分區小於 5。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.