python - una - ¿Puedo especificar un dtype numpy al generar valores aleatorios?
transpuesta de una matriz en python numpy (3)
Estoy creando una matriz numpy
de valores aleatorios y los agrego a una matriz existente que contiene flotantes de 32 bits. Me gustaría generar los valores aleatorios utilizando el mismo tipo de dty que la matriz de destino, para que no tenga que convertir los dtypes manualmente. Actualmente hago esto:
import numpy as np
x = np.zeros((10, 10), dtype=''f'')
x += np.random.randn(*x.shape).astype(''f'')
Lo que me gustaría hacer en lugar de la última línea es algo como:
x += np.random.randn(*x.shape, dtype=x.dtype)
pero randn
(y en realidad ninguno de los métodos numpy.random
) no acepta un argumento dtype
.
Mi pregunta específica es, ¿es posible especificar un dtype para números aleatorios cuando los creo, sin tener que llamar a un astype
? (Supongo que el generador de números aleatorios tiene una longitud de 64 bits, por lo que realmente no tiene sentido hacer esto, pero pensé que preguntaría si es posible).
P: ¿es posible especificar un tipo de dtype para números aleatorios cuando los creo?
A: No, no lo es. randn acepta la forma solo como randn (d0, d1, ..., dn)
Simplemente intente esto:
x = np.random.randn(10, 10).astype(''f'')
O definir una nueva función como
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 tiene que usar su código en la publicación, intente este código en su lugar
x = np.zeros((10, 10), dtype=''f'')
x[:] = np.random.randn(*x.shape)
Esto asigna los resultados de randn
a la memoria asignada por np.zeros
La función np.random.randn inicializa aleatoriamente el objeto de matriz de una forma dada en un "np.float64". Puede averiguarlo usted mismo haciendo lo siguiente:
a = np.random.rand(2,3)
b = a[1,2]
print (type(b))
print (type(a))
salida de la siguiente manera:
<class ''numpy.float64''>
<class ''numpy.ndarray''>
Permítanme comenzar diciendo que numpy ahora admite dtypes para enteros aleatorios. Esta mejora se puede rastrear a través del número 6790 en el github de numpy. Pero a partir de hoy, esta instalación no está disponible para el gaussian RNG
. Necesitaba este mismo servicio, así que escribí este parche para numpy, https://gist.github.com/se4u/e44f631b249e0be03c21c6c898059176
El parche solo agrega soporte para generar valores float
y no maneja otros tipos de datos, pero podría ser útil para alguien.