我有一个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最接近的值 .
7 回答
作为替代解决方案(这将对中间的数组
NaN
进行线性插值):这会产生:
这是一个使用简单的python迭代器的解决方案 . 它们实际上比
numpy.where
更有效,特别是对于大阵列!查看类似代码here的比较 .输出:
它仅替换此处请求的第一个和最后一个NaN .
以下将做到:
这是一个直接的
numpy
解决方案,不需要Python循环,没有递归,没有列表推导等 .递归解决方案!
我得到了这样的东西
它有点笨拙虽然它被分成两行,嵌套内联如果在其中一行中 .
我遇到了这个问题,不得不为散乱的NaN找到一个自定义的解决方案 . 下面的函数将任何NaN替换为右边的第一个数字,如果不存在,则将它替换为左边的第一个数字 . 可以进行进一步的操作以用边界出现的平均值替换它 .
结果是:
NaN
具有与自身比较不同的有趣属性,因此我们可以快速找到非纳米元素的索引:现在很容易用所需的值替换nans:
最后,我们可以把它放在一个函数中:
edit
哎哟,来自C我总是忘记列表范围... @ aix的解决方案比我的C ish循环更优雅和高效,使用它而不是我的 .