Search code examples
pythonnumpynormalize

How to normalize an array with rounding the result (python, numpy, scipy)


Further not the correct code. How to make it correct, short and beautiful?

def normalize_weights(weights, threshold=0.01):
    total = sum(weights)
    result = [x / total for x in weights]
    result = [int((1.0 / threshold) * x) * threshold for x in result]
    result[-1] = 1.0 - sum(result[:-1])
    print(result)
    result[-1] = int((1.0 / threshold) * result[-1]) * threshold
    print(result)

normalize_weights([1.0, 1.0, 1.0])
[0.33, 0.33, 0.33999999999999997]
[0.33, 0.33, 0.34]  # ok

normalize_weights([1.0, 3.0, 1.0])
[0.2, 0.6, 0.19999999999999996]
[0.2, 0.6, 0.19]  # wrong

thanks in advance

edit: The sum of the result should be equal 1.0


Solution

  • a = numpy.array([1.0,3.0,1.0])
    normalized_a = numpy.round(a/numpy.linalg.norm(a,1.0),2)
    # [0.2,0.6,0.2]
    

    maybe?

    a = numpy.array([1.0,1.0,1.0])
    normalized_a = numpy.round(a/numpy.linalg.norm(a,1.0),2)
    # [0.33,0.33,0.33]
    

    if you want to have 2 decimal places and force to 1.0 just fix it

    normalized_a[0] += 1.0 - numpy.sum(normalized_a) # we could just as easily fix the -1 index ...