更高效的fillna(numpy)

更高效的fillna(numpy),numpy,fillna,Numpy,Fillna,我需要一个数组版本的函数类似于Pandas.fillna,在论坛上我收集了很多答案来创建以下函数,但它仍然比Pandas.fillna慢3倍。我想知道是否有更好的方法来优化,谢谢 def fillna(self,axis=None,mask=None,value=None,method='pad'): """ array fillna Parameters ---------- self : 1d/2d axis : axis(

我需要一个数组版本的函数类似于Pandas.fillna,在论坛上我收集了很多答案来创建以下函数,但它仍然比Pandas.fillna慢3倍。我想知道是否有更好的方法来优化,谢谢

def fillna(self,axis=None,mask=None,value=None,method='pad'):
    """ array fillna

    Parameters
    ----------
    self       : 1d/2d

    axis       : axis(0 or 1)

    mask       : Custom mask, or Built np.isfinite(x)

    value      : int

    method     : 'back', 'pad', 'mean'
    --------
    """    
    x = np.asarray(self) 
    if mask is None: mask = np.isfinite(x)
    if (not value is None)|(method=='mean'):    
        out = x.copy()
        if x.ndim == 1:
            if method=='mean':
                  out[~mask] = np.nanmean(x)
            else: out[~mask] = value
        else:
            vask = ~mask * (np.nanmean(x,1)[:,None] if axis==1 else np.nanmean(x,0))
            out[~mask] = vask[~mask]
    else:
        if axis is None: axis = 0
        if x.ndim==1:
            if method=='pad':
                idx = np.where(mask,np.arange(mask.shape[0]),0)
                np.maximum.accumulate(idx,axis=0,out=idx)
                return x[idx]        
            elif method=='back':
                idx = np.where(mask[::-1],np.arange(mask.shape[0]),0)
                np.maximum.accumulate(idx,axis=0,out=idx)
                return x[mask.shape[0]-idx[::-1]-1]   
            else: return x
        if axis==1:
            if method=='back': mask = mask[:, ::-1]
            idx = np.where(mask,np.arange(mask.shape[1]),0)
        else:
            if method=='back': mask = mask[::-1,:]
            idx = np.where(mask,np.arange(mask.shape[0])[:,None],0)
        np.maximum.accumulate(idx,axis=axis,out=idx)
        if axis==1:
            if method=='back': idx = idx.shape[1]-idx[:, ::-1] - 1
            out = x[np.arange(idx.shape[0])[:,None], idx]
        else:
            if method=='back': idx = idx.shape[0]-idx[::-1, :] - 1
            out = x[idx,np.arange(idx.shape[1])]
    return out

您是否尝试过检查代码的热点?好的起点是Od,或者你可以检查你的索引使用是否正确。我看不到任何循环会让你慢下来。所有方法的速度都慢吗?还是其他情况?我没有看过,也没有使用过熊猫版本,所以我无法想象它有什么不同。