2015-02-05 54 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

相关问题