def nanmean(self, a: BlockArray, axis=None, keepdims=False, dtype=None): if not array_utils.is_float(a): a = a.astype(np.float64) num_summed = self.sum(~a.ufunc("isnan"), axis=axis, dtype=a.dtype, keepdims=keepdims) if num_summed.ndim == 0 and num_summed == 0: return self.scalar(np.nan) if num_summed.ndim > 0: num_summed = self.where( num_summed == 0, self.empty(num_summed.shape, num_summed.block_shape) * np.nan, num_summed, ) res = (self.reduce( "nansum", a, axis=axis, dtype=dtype, keepdims=keepdims) / num_summed) if dtype is not None: res = res.astype(dtype) return res
def nanvar(self, a: BlockArray, axis=None, ddof=0, keepdims=False, dtype=None): mean = self.nanmean(a, axis=axis, keepdims=True) ss = self.reduce( "nansum", (a - mean) ** self.two, axis=axis, dtype=dtype, keepdims=keepdims ) num_summed = ( self.sum(~a.ufunc("isnan"), axis=axis, dtype=a.dtype, keepdims=keepdims) - ddof ) res = ss / num_summed if dtype is not None: res = res.astype(dtype) return res
def abs(self, X: BlockArray): return X.ufunc("abs")
def exp(self, X: BlockArray): return X.ufunc("exp")
def log(self, X: BlockArray): return X.ufunc("log")
def sqrt(self, X: BlockArray) -> BlockArray: if X.dtype not in (float, np.float32, np.float64): X = X.astype(np.float64) return X.ufunc("sqrt")