def setmember1d(ar1, ar2): """ Return a boolean array set True where first element is in second array. See Also -------- numpy.setmember1d : equivalent function for ndarrays. """ ar1 = ma.asanyarray(ar1) ar2 = ma.asanyarray(ar2) ar = ma.concatenate((ar1, ar2)) b1 = ma.zeros(ar1.shape, dtype=np.int8) b2 = ma.ones(ar2.shape, dtype=np.int8) tt = ma.concatenate((b1, b2)) # We need this to be a stable sort, so always use 'mergesort' here. The # values from the first array should always come before the values from the # second array. perm = ar.argsort(kind="mergesort") aux = ar[perm] aux2 = tt[perm] # flag = ediff1d( aux, 1 ) == 0 flag = ma.concatenate((aux[1:] == aux[:-1], [False])) ii = ma.where(flag * aux2)[0] aux = perm[ii + 1] perm[ii + 1] = perm[ii] perm[ii] = aux # indx = perm.argsort(kind="mergesort")[: len(ar1)] # return flag[indx]
def setmember1d(ar1, ar2): """ Return a boolean array set True where first element is in second array. See Also -------- numpy.setmember1d : equivalent function for ndarrays. """ ar1 = ma.asanyarray(ar1) ar2 = ma.asanyarray( ar2 ) ar = ma.concatenate((ar1, ar2 )) b1 = ma.zeros(ar1.shape, dtype = np.int8) b2 = ma.ones(ar2.shape, dtype = np.int8) tt = ma.concatenate((b1, b2)) # We need this to be a stable sort, so always use 'mergesort' here. The # values from the first array should always come before the values from the # second array. perm = ar.argsort(kind='mergesort') aux = ar[perm] aux2 = tt[perm] # flag = ediff1d( aux, 1 ) == 0 flag = ma.concatenate((aux[1:] == aux[:-1], [False])) ii = ma.where( flag * aux2 )[0] aux = perm[ii+1] perm[ii+1] = perm[ii] perm[ii] = aux # indx = perm.argsort(kind='mergesort')[:len( ar1 )] # return flag[indx]
def setmember1d(ar1, ar2): """ This function is deprecated. Use ma.in1d() instead.""" ar1 = ma.asanyarray(ar1) ar2 = ma.asanyarray( ar2 ) ar = ma.concatenate((ar1, ar2 )) b1 = ma.zeros(ar1.shape, dtype = np.int8) b2 = ma.ones(ar2.shape, dtype = np.int8) tt = ma.concatenate((b1, b2)) # We need this to be a stable sort, so always use 'mergesort' here. The # values from the first array should always come before the values from the # second array. perm = ar.argsort(kind='mergesort') aux = ar[perm] aux2 = tt[perm] # flag = ediff1d( aux, 1 ) == 0 flag = ma.concatenate((aux[1:] == aux[:-1], [False])) ii = ma.where( flag * aux2 )[0] aux = perm[ii+1] perm[ii+1] = perm[ii] perm[ii] = aux # indx = perm.argsort(kind='mergesort')[:len( ar1 )] # return flag[indx]
def setmember1d(ar1, ar2): """ This function is deprecated. Use ma.in1d() instead.""" ar1 = ma.asanyarray(ar1) ar2 = ma.asanyarray(ar2) ar = ma.concatenate((ar1, ar2)) b1 = ma.zeros(ar1.shape, dtype=np.int8) b2 = ma.ones(ar2.shape, dtype=np.int8) tt = ma.concatenate((b1, b2)) # We need this to be a stable sort, so always use 'mergesort' here. The # values from the first array should always come before the values from the # second array. perm = ar.argsort(kind='mergesort') aux = ar[perm] aux2 = tt[perm] # flag = ediff1d( aux, 1 ) == 0 flag = ma.concatenate((aux[1:] == aux[:-1], [False])) ii = ma.where(flag * aux2)[0] aux = perm[ii + 1] perm[ii + 1] = perm[ii] perm[ii] = aux # indx = perm.argsort(kind='mergesort')[:len(ar1)] # return flag[indx]
def average(a, axis=None, weights=None, returned=False): """ Average the array over the given axis. Parameters ---------- axis : {None,int}, optional Axis along which to perform the operation. If None, applies to a flattened version of the array. weights : {None, sequence}, optional Sequence of weights. The weights must have the shape of a, or be 1D with length the size of a along the given axis. If no weights are given, weights are assumed to be 1. returned : {False, True}, optional Flag indicating whether a tuple (result, sum of weights/counts) should be returned as output (True), or just the result (False). """ a = asarray(a) mask = a.mask ash = a.shape if ash == (): ash = (1,) if axis is None: if mask is nomask: if weights is None: n = a.sum(axis=None) d = float(a.size) else: w = filled(weights, 0.0).ravel() n = umath.add.reduce(a._data.ravel() * w) d = umath.add.reduce(w) del w else: if weights is None: n = a.filled(0).sum(axis=None) d = umath.add.reduce((-mask).ravel().astype(int)) else: w = array(filled(weights, 0.0), float, mask=mask).ravel() n = add.reduce(a.ravel() * w) d = add.reduce(w) del w else: if mask is nomask: if weights is None: d = ash[axis] * 1.0 n = add.reduce(a._data, axis, dtype=float) else: w = filled(weights, 0.0) wsh = w.shape if wsh == (): wsh = (1,) if wsh == ash: w = np.array(w, float, copy=0) n = add.reduce(a * w, axis) d = add.reduce(w, axis) del w elif wsh == (ash[axis],): ni = ash[axis] r = [None] * len(ash) r[axis] = slice(None, None, 1) w = eval("w[" + repr(tuple(r)) + "] * ones(ash, float)") n = add.reduce(a * w, axis, dtype=float) d = add.reduce(w, axis, dtype=float) del w, r else: raise ValueError, "average: weights wrong shape." else: if weights is None: n = add.reduce(a, axis, dtype=float) d = umath.add.reduce((-mask), axis=axis, dtype=float) else: w = filled(weights, 0.0) wsh = w.shape if wsh == (): wsh = (1,) if wsh == ash: w = array(w, dtype=float, mask=mask, copy=0) n = add.reduce(a * w, axis, dtype=float) d = add.reduce(w, axis, dtype=float) elif wsh == (ash[axis],): ni = ash[axis] r = [None] * len(ash) r[axis] = slice(None, None, 1) w = eval("w[" + repr(tuple(r)) + "] * masked_array(ones(ash, float), mask)") n = add.reduce(a * w, axis, dtype=float) d = add.reduce(w, axis, dtype=float) else: raise ValueError, "average: weights wrong shape." del w if n is masked or d is masked: return masked result = n / d del n if isinstance(result, MaskedArray): if ((axis is None) or (axis == 0 and a.ndim == 1)) and (result.mask is nomask): result = result._data if returned: if not isinstance(d, MaskedArray): d = masked_array(d) if isinstance(d, ndarray) and (not d.shape == result.shape): d = ones(result.shape, dtype=float) * d if returned: return result, d else: return result
def average(a, axis=None, weights=None, returned=False): """Average the array over the given axis. Parameters ---------- axis : {None,int}, optional Axis along which to perform the operation. If None, applies to a flattened version of the array. weights : {None, sequence}, optional Sequence of weights. The weights must have the shape of a, or be 1D with length the size of a along the given axis. If no weights are given, weights are assumed to be 1. returned : {False, True}, optional Flag indicating whether a tuple (result, sum of weights/counts) should be returned as output (True), or just the result (False). """ a = asarray(a) mask = a.mask ash = a.shape if ash == (): ash = (1,) if axis is None: if mask is nomask: if weights is None: n = a.sum(axis=None) d = float(a.size) else: w = filled(weights, 0.0).ravel() n = umath.add.reduce(a._data.ravel() * w) d = umath.add.reduce(w) del w else: if weights is None: n = a.filled(0).sum(axis=None) d = umath.add.reduce((-mask).ravel().astype(int)) else: w = array(filled(weights, 0.0), float, mask=mask).ravel() n = add.reduce(a.ravel() * w) d = add.reduce(w) del w else: if mask is nomask: if weights is None: d = ash[axis] * 1.0 n = add.reduce(a._data, axis, dtype=float) else: w = filled(weights, 0.0) wsh = w.shape if wsh == (): wsh = (1,) if wsh == ash: w = np.array(w, float, copy=0) n = add.reduce(a*w, axis) d = add.reduce(w, axis) del w elif wsh == (ash[axis],): ni = ash[axis] r = [None]*len(ash) r[axis] = slice(None, None, 1) w = eval ("w["+ repr(tuple(r)) + "] * ones(ash, float)") n = add.reduce(a*w, axis, dtype=float) d = add.reduce(w, axis, dtype=float) del w, r else: raise ValueError, 'average: weights wrong shape.' else: if weights is None: n = add.reduce(a, axis, dtype=float) d = umath.add.reduce((-mask), axis=axis, dtype=float) else: w = filled(weights, 0.0) wsh = w.shape if wsh == (): wsh = (1,) if wsh == ash: w = array(w, dtype=float, mask=mask, copy=0) n = add.reduce(a*w, axis, dtype=float) d = add.reduce(w, axis, dtype=float) elif wsh == (ash[axis],): ni = ash[axis] r = [None]*len(ash) r[axis] = slice(None, None, 1) w = eval ("w["+ repr(tuple(r)) + \ "] * masked_array(ones(ash, float), mask)") n = add.reduce(a*w, axis, dtype=float) d = add.reduce(w, axis, dtype=float) else: raise ValueError, 'average: weights wrong shape.' del w if n is masked or d is masked: return masked result = n/d del n if isinstance(result, MaskedArray): if ((axis is None) or (axis==0 and a.ndim == 1)) and \ (result.mask is nomask): result = result._data if returned: if not isinstance(d, MaskedArray): d = masked_array(d) if isinstance(d, ndarray) and (not d.shape == result.shape): d = ones(result.shape, dtype=float) * d if returned: return result, d else: return result