我有一个NumPy数组a
如下:
>>> str(a)
'[ nan nan nan 1.44955726 1.44628034 1.44409573\n 1.4408188 1.43657094 1.43171624 1.42649744 1.42200684 1.42117704\n 1.42040255 1.41922908 nan nan nan nan\n nan nan]'
我想用最接近的非NaN值替换每个NaN,这样开始的所有NaN都被设置为1.449...
,结束的所有NaN都被设置为1.419...
。
我可以看到如何在这样的特定情况下做到这一点,但我需要能够在任何长度的数组中做到这一点,在数组的开头和结尾都有任何长度的NaN(在数字中间没有NaN)。
我可以用np.isnan()
很容易地找到NaN,但我不知道如何获得与每个NaN最接近的值。
8条答案
按热度按时间dzhpxtsq1#
作为替代解决方案(这也将对中间的阵列
NaN
s进行线性插值):这产生:
mum43rcc2#
我想用最接近的非NaN值替换每个NaN……在数字中间将没有NaN
下面的代码可以做到这一点:
这是一个直接的
numpy
解决方案,不需要Python循环,不需要递归,不需要列表解析等。ccgok5k53#
NaN
s有一个有趣的特性,可以比较不同的元素,因此我们可以快速找到非nan元素的索引:现在很容易用所需的值替换NAN:
最后,我们可以把它放在一个函数中:
编辑
哎呀,从C开始,我总是忘记列表范围...@aix的解决方案比我的Cish循环更优雅和高效,使用它而不是我的。
fd3cxomn4#
递归解决方案!
2w2cym1i5#
我遇到了这个问题,不得不为分散的NaN找到一个自定义的解决方案。下面的函数用右边出现的第一个数字替换任何NaN,如果不存在,它用左边出现的第一个数字替换。可以做进一步的操作,用边界出现的平均值替换它。
结果为:
o4hqfura6#
我有这样的东西
它有点笨拙,因为它被分成两行,其中一行嵌套了内联if。
l2osamch7#
这里是一个使用简单的Python迭代器的解决方案。它们实际上比
numpy.where
更有效,特别是对于大数组!请参阅类似代码here的比较。输出:
它只替换第一个和最后一个NaN,就像这里要求的那样。
kyks70gy8#
不是最优的,但我发现转换到pandas Series,然后使用interpolate()和“method='nearest'”对我来说是最简单的。但是,有必要确保边缘不是NaN。