繁体   English   中英

numpy 如何在数组/列表中找到中位数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM