2015-02-05 57 views
0

陣列我怎樣才能獲得中值的指數包含NaN的數組?獲取中間值的指數中包含的NaN

例如,我的數值爲[Nan, 2, 5, NaN, 4, NaN, 3, 1],其值爲[np.nan, 0.1, 0.2, np.nan, 0.1, np.nan, 0.4, 0.3]。然後中位數是3,而錯誤是0.4

有沒有一種簡單的方法來做到這一點?

編輯:我編輯的錯誤陣列暗示更現實的情況。是的,我正在使用numpy。

+2

你想要什麼,如果有多個值的中位數,如'[1,2,2,3]'? – DSM 2015-02-05 16:36:01

+0

@DSM,你是指中位數本身還是錯誤?中位數也是爲偶數值數組定義的。 – 2015-02-05 16:39:47

+0

@ Py-ser:在您的標題和您的問題中,您指的是中值的**索引**,而不是中值。 – DSM 2015-02-05 16:40:38

回答

4

這不是真的清楚你打算如何有意義地提取從平均誤差,但如果你碰巧有一個數組使得中值是其項目之一,相應的錯誤數組對應的索引定義,還有沒有其他項具有相同值的中位數,和其他大概有免責聲明,那麼你就可以做到以下幾點:

a = np.array([np.nan,2,5,np.nan, 4,np.nan,3,1]) 
aerr = np.array([np.nan, 0.1, 0.2, np.nan, 0.1, np.nan, 0.4, 0.3]) 

# median, ignoring NaNs 
amedian = np.median(a[np.isfinite(a)]) 
# find the index of the closest value to the median in a 
idx = np.nanargmin(np.abs(a-amedian)) 
# this is the corresponding "error" 
aerr[idx] 

編輯:作爲@DSM指出,如果你有NumPy的1.9或以上,您可以將amedian的計算簡化爲amedian = np.nanmedian(a)

+1

如果我們知道這是OP是什麼之後,我們可以在現代'numpy'使用'np.nanmedian'簡單的'amedian'線一點點。 – DSM 2015-02-05 16:58:11

2

numpy的有你需要的一切:

values = np.array([np.nan, 2, 5, np.nan, 4, np.nan, 3, 1]) 
errors = np.array([np.nan, 0.1, 0.2, np.nan, 0.1, np.nan, 0.4, 0.3]) 

# filter 
filtered = values[~np.isnan(values)] 
# find median 
median = np.median(filtered) 
# find indexes 
indexes = np.where(values == median)[0] 
# find errors 
errors[indexes] # array([ 0.4]) 
0

比方說您有您的列表命名爲「A」,那麼你可以使用這個碼至發現沒有「南」一個蒙面數組,然後做中間有np.ma.median()

a=[Nan, 2, 5, NaN, 4, NaN, 3, 1] 
am = numpy.ma.masked_array(a, [numpy.isnan(x) for x in a]) 
numpy.ma.median(am) 

你也可以做同樣的錯誤。

+0

我不確定這是否正在做我所需要的。 – 2015-02-05 16:56:34

+0

這會忽略你的NaN值 – 2015-02-05 17:00:38

相關問題