首页 > 解决方案 > 如何在列表中找到除 NaN 之外的最后一个有效索引

问题描述

我的最终目标是找到满足某些条件的有效列表。我有几个具有多个 float 和 np.nan 值的灯。我喜欢选择在某个范围内没有 nan 值的列表。

这是我的清单之一。

list = 
[          nan  -38.10940798  -52.15497422  -68.94011301 -112.58576732
 -110.27810095 -110.61354039 -131.82121921 -137.27076671 -134.34755197
 -125.4644195  -128.78669345 -134.30116567 -136.47002098 -142.14361377
 -142.86356029 -136.64266941 -128.34936325 -121.94468169 -131.72934853
 -135.34244008 -134.77085591 -137.3350188  -139.08824299 -140.45602586
 -143.47342506 -142.41400071 -139.16437999 -139.41824163 -141.88900778
 -142.26951505 -142.5739776  -142.6418401  -144.03415115 -142.03099862
 -141.96427292 -139.52750524 -137.56815712           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan]

所以,我喜欢过滤掉这个列表,因为这个列表的 nan 从索引 -25 到索引 -1

我试过了

if np.nansum(list[-25:-1]) == 0
    list = np.nan

我试过了

if np.nanmean(list[-25:-1]) == 0
    list = np.nan

两种情况都不起作用。

我有几个没有nan和有nan的列表。所以,我想要做的是 1)从确切范围中选择具有 nan 的列表 2)并使该列表具有所有 nan

标签: pythonindexingnan

解决方案


我看到您正在使用 NumPy,所以这是一种方法:

s = '''          nan  -38.10940798  -52.15497422  -68.94011301 -112.58576732
 -110.27810095 -110.61354039 -131.82121921 -137.27076671 -134.34755197
 -125.4644195  -128.78669345 -134.30116567 -136.47002098 -142.14361377
 -142.86356029 -136.64266941 -128.34936325 -121.94468169 -131.72934853
 -135.34244008 -134.77085591 -137.3350188  -139.08824299 -140.45602586
 -143.47342506 -142.41400071 -139.16437999 -139.41824163 -141.88900778
 -142.26951505 -142.5739776  -142.6418401  -144.03415115 -142.03099862
 -141.96427292 -139.52750524 -137.56815712           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan
           nan           nan           nan           nan           nan'''

a = np.fromstring(s, sep=' ')
if np.isnan(a[-25:-1]).all(): # check if all values in range are NaN
    a[:] = np.nan             # Set all values to NaN

要找到最后一个有效索引,您可以执行以下操作:

len(a) - (~np.isnan(a))[::-1].argmax()
# 38

推荐阅读