2 votes

Distribution uniforme Numpy avec décroissance

J'essaie de construire une matrice de distributions uniformes se dégradant vers 0 au même taux dans chaque ligne. Les distributions doivent être comprises entre -1 et 1. Je cherche à construire quelque chose qui ressemble à.. :

[[0.454/exp(0) -0.032/exp(1) 0.641/exp(2)...]
 [-0.234/exp(0) 0.921/exp(1) 0.049/exp(2)...]
 ...
 [0.910/exp(0) 0.003/exp(1) -0.908/exp(2)...]]

Je peux construire une matrice de distributions uniformes en utilisant :

w = np.array([np.random.uniform(-1, 1, 10) for i in range(10)])

et peut obtenir le résultat souhaité en utilisant un for boucle avec :

for k in range(len(w)):
    for l in range(len(w[0])):
        w[k][l] = w[k][l]/np.exp(l)

mais je voulais savoir s'il y avait un meilleur moyen d'y parvenir.

6voto

Alok Singhal Points 33073

Vous pouvez utiliser la fonction de diffusion de numpy pour faire cela :

w = np.random.uniform(-1, 1, size=(10, 10))
weights = np.exp(np.arange(10))
w /= weights

1voto

benten Points 1289

La réponse d'Alok Singhal est la meilleure, mais comme autre façon de faire (peut-être plus explicite) vous pouvez dupliquer le vecteur [exp(0), ...,exp(9)] et les empiler dans une matrice en faisant un produit externe avec un vecteur de uns. Divisez ensuite la matrice 'w' par la nouvelle matrice 'decay'.

n=10
w = np.array([np.random.uniform(-1, 1, n) for i in range(n)])
decay = np.outer( np.ones((n,1)), np.exp(np.arange(10)) )
result = w/decay

Vous pouvez également utiliser np.tile pour créer une matrice à partir de plusieurs copies d'un vecteur. Elle accomplit la même chose que l'astuce du produit externe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X