2
votes

Tableau aléatoire Numpy limité par d'autres tableaux

J'ai deux ndarrays numpy avec les mêmes tailles.

a = np.random.randn(x,y)
b = np.random.randn(x,y)

Je veux créer un nouveau tableau, où chaque élément sera une valeur aléatoire entre les valeurs des éléments avec les mêmes indices dans a et dans b . Ainsi, chaque élément c [i] [j] doit être compris entre a [i] [j] et b [i] [j] . Existe-t-il un moyen plus rapide / plus simple / plus efficace que de parcourir tous les éléments de c et d'attribuer des valeurs aléatoires?


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser numpy. random.uniform , de la documentation:

low: float ou array_like de floats, facultatif

Limite inférieure de l'intervalle de sortie. Toutes les valeurs générées seront supérieur ou égal à faible. La valeur par défaut est 0.

high: float ou array_like de floats

Limite supérieure de l'intervalle de sortie. Toutes les valeurs générées seront moins que élevé. La valeur par défaut est 1.0.

Ainsi, à la fois low et high peuvent recevoir des tableaux en tant que paramètres, par souci d'exhaustivité, voir le code ci-dessous:

Code:

c = np.random.uniform(np.minimum(a, b), np.maximum(a, b), (x, y))

Sortie

True

Dans l'exemple ci-dessus notez l'utilisation du maximum et minimum pour construire les deux haut et bas . La dernière ligne vérifie qu'effectivement toutes les valeurs de c sont comprises entre high et low . Vous pouvez tout faire en une seule ligne, si cela vous intéresse:

import numpy as np

x, y = 5, 5

a = np.random.randn(x, y)
b = np.random.randn(x, y)

high = np.maximum(a, b)
low = np.minimum(a, b)

c = np.random.uniform(low, high, (x, y))

print((low <= c).all() and (c <= high).all())


0 commentaires

2
votes

Voici une idée utilisant numpy :

a = np.random.randn(2,5)
array([[ 1.56068748, -2.21431346],
       [-0.33707115,  0.93420256]])

b = np.random.randn(2,5)
array([[-0.0522846 ,  0.11635731],
       [-0.57028069, -1.08307492]])

# Create an interleaved array from both a and b 
s = np.vstack((a.ravel(),b.ravel()))

array([[ 1.56068748, -2.21431346, -0.33707115,  0.93420256],
       [-0.0522846 ,  0.11635731, -0.57028069, -1.08307492]])

# Feed it to `np.random.uniform` which takes low and high as inputs 
# and reshape it to match input shape
np.random.uniform(*s).reshape(a.shape)

array([[ 0.14467235, -0.79804187],
       [-0.41495614, -0.19177284]])


0 commentaires

3
votes

vous pouvez faire ceci:

c=a+(b-a)*d

avec d = tableau aléatoire avec des valeurs entre 0 et 1 dans les mêmes dimensions comme un


0 commentaires