陣列我怎樣才能獲得中值的指數包含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。
陣列我怎樣才能獲得中值的指數包含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。
這不是真的清楚你打算如何有意義地提取從平均誤差,但如果你碰巧有一個數組使得中值是其項目之一,相應的錯誤數組對應的索引定義,還有沒有其他項具有相同值的中位數,和其他大概有免責聲明,那麼你就可以做到以下幾點:
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)
。
如果我們知道這是OP是什麼之後,我們可以在現代'numpy'使用'np.nanmedian'簡單的'amedian'線一點點。 – DSM 2015-02-05 16:58:11
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])
比方說您有您的列表命名爲「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)
你也可以做同樣的錯誤。
我不確定這是否正在做我所需要的。 – 2015-02-05 16:56:34
這會忽略你的NaN值 – 2015-02-05 17:00:38
你想要什麼,如果有多個值的中位數,如'[1,2,2,3]'? – DSM 2015-02-05 16:36:01
@DSM,你是指中位數本身還是錯誤?中位數也是爲偶數值數組定義的。 – 2015-02-05 16:39:47
@ Py-ser:在您的標題和您的問題中,您指的是中值的**索引**,而不是中值。 – DSM 2015-02-05 16:40:38