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

Get the index of median value in array containing Nans

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

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",那么您可以使用此代码找到不带 "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)

您也可以对错误执行相同的操作。

不太清楚你打算如何从中位数中有意义地提取误差,但如果你碰巧有一个数组,其中中位数是它的条目之一,并且相应的误差数组定义在相应的索引,并且没有其他条目与中位数具有相同的值,并且可能还有其他几个免责声明,那么您可以执行以下操作:

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)