mad calculation can be replaced by:
x = np.array([1, 2, 3, 6]) c = np.array([2, 3, 1, 2]) count = np.multiply.outer(c, c) mad = np.abs(np.subtract.outer(x, x) * count).sum() / count.sum()
np.mean(x) can be replaced by:
np.average(x, weights=c)
Here is the full function:
def gini(x, weights=None): if weights is None: weights = np.ones_like(x) count = np.multiply.outer(weights, weights) mad = np.abs(np.subtract.outer(x, x) * count).sum() / count.sum() rmad = mad / np.average(x, weights=weights) return 0.5 * rmad
to check the result, gini2() use numpy.repeat() to repeat the elements:
def gini2(x, weights=None): if weights is None: weights = np.ones(x.shape[0], dtype=int) x = np.repeat(x, weights) mad = np.abs(np.subtract.outer(x, x)).mean() rmad = mad / np.mean(x) return 0.5 * rmad
source share