web-dev-qa-db-fra.com

Puis-je spécifier un dtype numpy lors de la génération de valeurs aléatoires?

Je crée un tableau numpy de valeurs aléatoires et je les ajoute à un tableau existant contenant des flottants 32 bits. Je voudrais générer les valeurs aléatoires en utilisant le même dtype que le tableau cible, de sorte que je n'ai pas à convertir les dtypes manuellement. Actuellement, je fais ceci:

import numpy as np

x = np.zeros((10, 10), dtype='f')
x += np.random.randn(*x.shape).astype('f')

Ce que j'aimerais faire à la place de la dernière ligne, c'est quelque chose comme:

x += np.random.randn(*x.shape, dtype=x.dtype)

mais randn (et en fait aucun des numpy.random méthodes) n'accepte pas un argument dtype.

Ma question spécifique est, est-il possible de spécifier un dtype pour les nombres aléatoires lorsque je les crée, sans avoir à appeler astype? (Je suppose que le générateur de nombres aléatoires a une longueur de 64 bits, donc cela n'a pas vraiment de sens de le faire, mais j'ai pensé demander si c'est possible.)

25
lmjohns3

Q: est-il possible de spécifier un dtype pour les nombres aléatoires lorsque je les crée.

R: Non, ce n'est pas le cas. randn accepte la forme uniquement comme randn (d0, d1, ..., dn)

Essayez simplement ceci:

x = np.random.randn(10, 10).astype('f')

Ou définir une nouvelle fonction comme

np.random.randn2 = lambda *args, **kwarg: np.random.randn(*args).astype(kwarg.get('dtype', np.float64))
x = np.random.randn2(10, 10, dtype='f')

Si vous devez utiliser votre code sur le message, essayez plutôt ce code

x = np.zeros((10, 10), dtype='f')
x[:] = np.random.randn(*x.shape)

Ceci affecte les résultats de randn à la mémoire allouée par np.zeros

25
emeth

Permettez-moi de commencer en disant que numpy prend désormais en charge les dtypes pour les nombres entiers aléatoires. Cette amélioration peut être suivie via Issue # 679 sur le github de numpy. Mais à ce jour, cette fonctionnalité n'est pas disponible pour le gaussian RNG. J'avais besoin de cette même fonctionnalité, j'ai donc écrit ce correctif pour numpy, https://Gist.github.com/se4u/e44f631b249e0be03c21c6c898059176

Le correctif ajoute uniquement la prise en charge de la génération de valeurs float et il ne gère pas d'autres types de données, mais il peut quand même être utile à quelqu'un.

3
Pushpendre

la fonction np.random.randn initialise de manière aléatoire l'objet tableau d'une forme donnée en "np.float64". Vous pouvez le découvrir vous-même en procédant comme suit:

a = np.random.Rand(2,3)
b = a[1,2]
print (type(b))
print (type(a))

sortie comme suit:

<class 'numpy.float64'>
<class 'numpy.ndarray'>
0
Shekar