获取包含Nans的数组中值的索引

时间:2015-02-05 16:30:31

标签: python numpy nan median

如何获得包含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。

3 个答案:

答案 0 :(得分: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 :(得分: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])

答案 2 :(得分:0)

假设您的列表名为“a”,然后您可以使用此代码查找没有“Nan”的掩码数组,然后使用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)

你也可以做同样的错误。