def nanmean(a, axis=None, keepdims=None, *args, **kwargs): n = sp.nansum(a, axis=axis, keepdims=keepdims) d = sp.nansum(sp.nan_to_num(a) != 0, axis=axis, keepdims=keepdims).astype(n.dtype) n = sp(data=n.data, coords=n.coords, fill_value=np.nan, shape=n.shape) d = sp(data=d.data, coords=d.coords, fill_value=np.nan, shape=d.shape) out = n / d return sp(data=out.data, coords=out.coords, fill_value=0, shape=out.shape)
def array(a, *args, **kwargs): if kwargs.get("fill_value", None) is not None: fill_value = kwargs.pop("fill_value") else: fill_value = sp.nan if type(a) == sp: return sp(a, *args, **kwargs, fill_value=fill_value) else: return sp(np.array(a, *args, **kwargs), fill_value=fill_value)
def nanmean(a, axis=None, keepdims=None, *args, **kwargs): n = sp.nansum(a, axis=axis, keepdims=keepdims) d = sp.nansum(sp.nan_to_num(a)!=0, axis=axis, keepdims=keepdims).astype(n.dtype) n.fill_value=np.nan d.fill_value=np.nan n = sp(n) d = sp(d) out = n / d out.fill_value = 0 return sp(out)
def nan_to_num(a): if type(a) in [int, float, np.int64, np.float64]: return np.nan_to_num(a) if hasattr(a, "fill_value"): a = a.copy() a.data[np.isnan(a.data)] = 0.0 return sp(coords=a.coords, data=a.data, fill_value=0.0, shape=a.shape)
def cumfunc(a, axis, func): a = copy.deepcopy(a) ax = np.arange(a.ndim) axis = ax[axis] x = pd.DataFrame(a.coords.T) x.columns = ['0', '1', '2', '3'] cols = [item for item in x.columns if item != str(axis)] x['y']=a.data x = pd.pivot_table( x , columns=cols, index=str(axis), values='y') missing = pd.Int64Index( set(np.arange(a.shape[axis])) - set(x.index), name=str(axis)) if len(missing) > 0: x = x.append(pd.DataFrame( np.repeat((x.iloc[0:1]*0).values, len(missing), axis=0), index=missing, columns=x.columns)) x = x.unstack().reset_index().fillna(0) x.columns = [item for item in x.columns[:-1]] + ['y'] x = x.set_index(list(x.columns[:-1])).groupby(level=[0,1,2]) if func == 'cumsum': x = x.cumsum().reset_index() if func == 'cumprod': x = x.cumprod().reset_index() x = x[x['y']!=0] a.coords = x[['0', '1', '2', '3']].values.T a.data = x['y'].values return sp(a)
def nanmedian(a, axis=None, keepdims=None, *args, **kwargs): new_a = np.nanmedian(a.todense(), axis=axis, keepdims=keepdims, *args, **kwargs) return sp(np.nan_to_num(new_a), fill_value=np.nan)
def nanquantile(a, q, axis=None, keepdims=None, *args, **kwargs): new_a = np.nanquantile(a.todense(), q=q, axis=axis, keepdims=keepdims, *args, **kwargs) return sp(np.nan_to_num(new_a), fill_value=np.nan)
def nan_to_num(a): if type(a) in [int, float, np.int64, np.float64]: return np.nan_to_num(a) if hasattr(a, "fill_value"): a = a.copy() a.data[np.isnan(a.data)] = 0.0 if a.fill_value != 0.0: a.fill_value = 0.0 return sp(a)
def swapaxes(a, axis1, axis2): ax = np.arange(a.ndim) axis1 = ax[axis1] axis2 = ax[axis2] fv = a.fill_value l = [] for item in range(a.ndim): if item == axis1: l.append(axis2) elif item == axis2: l.append(axis1) else: l.append(item) coords = a.coords[l,:] return sp(coords, a.data, shape=tuple([a.shape[item] for item in l]), prune=True, fill_value=fv)
def cumsum(a, axis): a = copy.deepcopy(a) x = pd.DataFrame(a.coords.T) x.columns = ['0', '1', '2', '3'] cols = [item for item in x.columns if item != str(axis)] x['y'] = a.data x = pd.pivot_table(x, columns=cols, index=str(axis), values='y') missing = list(set(np.arange(a.shape[axis])) - set(x.index)) if len(missing) > 0: x = x.append( pd.DataFrame(np.repeat((x.iloc[0:1] * 0).values, len(missing), axis=0), index=missing, columns=x.columns)) x = x.unstack().reset_index().fillna(0) x.columns = [0, 1, 2, 3, 'y'] x = x.set_index([0, 1, 2, 3]).groupby(level=2).cumsum().reset_index() x = x[x['y'] > 0] a.coords = x[[0, 1, 2, 3]].values.T a.data = x['y'].values return sp(a)
def ones(*args, **kwargs): return sp(np.ones(*args, **kwargs), fill_value=sp.nan)
def apply_along_axis(func1d, axis, arr, *args, **kwargs): fv = arr.fill_value arr = np.apply_along_axis(func1d, axis, arr.todense(), *args, **kwargs) return sp(arr, fill_value=fv)
def around(a, *args, **kwargs): fv = a.fill_value a = np.around(a.todense(), *args, **kwargs) return sp(a, fill_value=fv)
def unique(a, *args, **kwargs): fv = a.fill_value a = np.unique(a.todense(), *args, **kwargs) return sp(a, fill_value=fv)
def array(*args, **kwargs): return sp(np.array(*args, **kwargs))
def ones(*args, **kwargs): return sp(np.ones(*args, **kwargs))
def nansum(a, axis=None, keepdims=None, *args, **kwargs): return sp(data=a.data, coords=a.coords, fill_value=0.0, shape=a.shape).sum(axis=axis, keepdims=keepdims, *args, **kwargs)