es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Selección aleatoria de Numpy con un tamaño de matriz no regular.

Estoy haciendo una matriz de sumas de elecciones aleatorias de una distribución binomial negativa (DBN), donde cada suma tiene una longitud no regular. Actualmente lo implemento de la siguiente manera:

import numpy
from numpy.random import defaultrng
rng = defaultrng()

nbd = rng.negativebinomial(1, 0.5, int(1e6))
gmc = [12, 35, 4, 67, 2]
npp = np.empty(len(gmc))
for i in range(len(gmc)):
    n_pp[i] = np.sum(rng.choice(nbd, gmc[i]))

Esto funciona, pero es lento cuando lo aplico a mis datos reales (gmc tiene una dimensión de 1e6), y me gustaría variar esto para múltiples valores de n y p en la DBN (en este ejemplo están establecidos en 1 y 0.5, respectivamente).

Me gustaría encontrar una forma pythonica de hacer esto que elimine el bucle, pero no estoy seguro de que sea posible. Quiero usar default_rng porque genera números aleatorios de mejor calidad que la forma antigua de hacerlo (np.random.choice), si es posible.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Es posible eliminar el bucle y hacer esto más pythonico. Se puede usar la función numpy.random.choice para generar un arreglo de elecciones aleatorias de la distribución binomial negativa, y luego usar la función numpy.sum para sumar los elementos del arreglo. Esto será mucho más rápido que hacer un bucle a través del arreglo y sumar los elementos uno por uno.

    Por ejemplo, el siguiente código generará un arreglo de sumas de elecciones aleatorias de una distribución binomial negativa con n = 1 y p = 0.5:

    import numpy
    from numpy.random import default_rng
    rng = default_rng()
    
    nbd = rng.negative_binomial(1, 0.5, int(1e6))
    gmc = [12, 35, 4, 67, 2]
    n_pp = np.sum(rng.choice(nbd, gmc), axis=1)
    

Comments are closed.