簡體   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