2015-10-03 36 views
4

有沒有類似numpy.argmin(x),但是中位數?有沒有辦法在一個命令中獲取python中位數的索引?

+1

鑑於谷歌*「numpy median」*容易得到結果,我將不得不假設你根本沒有做過任何研究。 – jonrsharpe

+0

標題應該是「在Python中」而不是「在numpy」中。我無法使用谷歌找到它。 –

+2

我可以做np.argmin(np.abs(np.median(x) - x)),但想知道是否已經有命令。 –

回答

5

快速逼近:

numpy.argsort(data)[len(data)//2] 
1

您可以使用元素(zip)保留索引並對中間的中間或兩個元素上的元素進行排序並返回,但排序將爲O(n.logn)。就時間複雜度而言,以下方法是O(n)

import numpy as np 

def arg_median(a): 
    if len(a) % 2 == 1: 
     return np.where(a == np.median(a))[0][0] 
    else: 
     l,r = len(a)/2 -1, len(a)/2 
     left = np.partition(a, l)[l] 
     right = np.partition(a, r)[r] 
     return [np.where(a == left)[0][0], np.where(a==right)[0][0]] 

print(arg_median(np.array([ 3, 9, 5, 1, 15]))) 
# 1 3 5 9 15, median=5, index=2 
print(arg_median(np.array([ 3, 9, 5, 1, 15, 12]))) 
# 1 3 5 9 12 15, median=5,9, index=2,1 

輸出:

2 
[2, 1] 

我們的想法是,如果僅存在一箇中間值(陣列具有奇數長度),則返回值的索引。如果我們需要平均到元素(數組有長度),那麼它返回列表中這兩個元素的索引。

1

看來老問題,但我發現了一個很好的方法,使之如此:

import random 
import numpy as np 
#some random list with 20 elements 
a = [random.random() for i in range(20)] 
#find the median index of a 
medIdx = a.index(np.percentile(a,50,interpolation='nearest')) 

這裏的絕招是最近插值百分內置選項,從列表中返回一個「真實」中值,因此之後搜索它是安全的。

+0

接受的答案'numpy.argsort(data)[len(data)// 2]'是3-4倍的速度,但這個仍然是優雅的:) – leermeester

相關問題