0

我想优化一个 numpy 函数来填充数组的一部分。它需要一个' 内部np.array()的1D。nan其中一些都在左侧,我只希望它们用零填充。例子:

由此:

np.array([ np.nan, np.nan, np.nan, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

我想得到这个:

np.array([ 0, 0, 0, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

其他“内部”缺失值应该保持不变,我会以不同的方式处理它们。

最Pythonic的方法是什么?

4

3 回答 3

2

与上述类似的解决方案,使用np.minandnp.where代替maxand np.argmax

import numpy as np

x = np.array([ np.nan, np.nan, np.nan, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

x[0:np.min(np.where(~np.isnan(x)))] = 0

我认为这更具可读性,就像句子“将索引 0 中的所有值设置为值不是 nan 为零的最小索引”一样

于 2020-03-14T12:18:08.927 回答
1

尝试:

import numpy as np

x=np.array([ np.nan, np.nan, np.nan, 3, 4, 5, np.nan, 7, 8, 9, np.nan ])

x[0:max(np.argmax(~np.isnan(x)),0)]=0

输出:

[ 0.  0.  0.  3.  4.  5. nan  7.  8.  9. nan]
于 2020-03-14T12:11:28.613 回答
0

我自己也找到了解决方案:

def left_zero_fill(x):
    if np.isfinite(x[0]): return x

    cumsum = np.cumsum(np.isnan(x))    
    x[ :np.argmax(cumsum[:-1]==cumsum[1:]) +1] = 0
    return x

它们的执行时间非常相似。差异很小,它们都有效。谢谢大家的帮助。


编辑:替换not np.isnannp.isfinite最快的实现。

于 2020-03-14T12:37:50.783 回答