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?
3 Réponses :
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())
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]])
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