[Python] Numpy vectorized version of my deterministic Python function returns different set of...

Discussão em 'Python' iniciado por Stack, Abril 30, 2025.

  1. Stack

    Stack Membro Participativo

    In the following runnable Python program the arrays values and check_values contain different elements. On my machine the complete output is the following:

    Received k = 0, generating value n = 0; 3k < n <==> False
    Received k = 0, generating value n = 0; 3k < n <==> False
    Received k = 1, generating value n = 2; 3k < n <==> False
    Received k = 2, generating value n = 2; 3k < n <==> False
    Received k = 3, generating value n = 4; 3k < n <==> False
    Received k = 0, generating value n = 0; 3k < n <==> False
    Received k = 1, generating value n = 2; 3k < n <==> False
    Received k = 2, generating value n = 2; 3k < n <==> False
    Received k = 3, generating value n = 4; 3k < n <==> False
    values: [0 0 1 0]
    check_values: [0. 0.125 1.81097638 0.98330026]


    The list check_values contains correct values; the list values does not. I have no clue what could be the reason for this and I could not find help online. All help is appreciated!

    The code:

    import numpy as np
    import math
    from math import comb as ncr

    def bound_1(k, n):
    t = 3 * k - n
    if t % 2 != 0:
    t -= 1
    return int(t / 2)


    def bound_2(k, n):
    t = 3 * k - n
    ret = 0
    if t % 2 == 0:
    ret = t / 2 - 1
    else:
    ret = (t - 1) / 2
    return int(ret)


    def binomial_comb_sum(s, e, v):
    sum = 0
    for m in range(s, e + 1):
    sum += ncr(v, m)
    return sum


    def binary_entropy(p):
    if p <= 0 or p >= 1: return 0
    return -(p * math.log2(p) + (1 - p) * math.log2(1 - p))


    def n_value_from_k(k):
    return 2 * int(math.pow(k, 0.75))


    def energy(k, n):
    if 3 * k < n: return 0
    b1, b2 = bound_1(k, n), bound_2(k, n)
    sum1, sum2 = 0, 0

    for p in range(1, b1 + 1):
    t = n + 2 * p
    d = binary_entropy(p / t) - 1
    sum1 += math.pow(2, t * d)

    for p in range(0, b2 + 1):
    t = n + 2 * p + 1
    d = binary_entropy(p / t) - 1
    sum2 += math.pow(2, t * d)

    return sum1 + sum2

    def energy_wrt_k(k):
    n = n_value_from_k(k)
    print(f"Received k = {k}, generating value n = {n}; 3k < n <==> {3 * k < n}")
    return energy(k, n)

    N = 3
    k_vals = np.arange(N + 1)

    vectorized_energy_wrt_k = np.vectorize(energy_wrt_k)

    values = vectorized_energy_wrt_k(k_vals)

    check_values = np.array([energy_wrt_k(k) for k in k_vals])


    print("values:", values)
    print("check_values:", check_values)

    Continue reading...

Compartilhe esta Página