I'm creating a numpy
array of random values and adding them to an existing array containing 32-bit floats. I'd like to generate the random values using the same dtype as the target array, so that I don't have to convert the dtypes manually. Currently I do this:
import numpy as np
x = np.zeros((10, 10), dtype='f')
x += np.random.randn(*x.shape).astype('f')
What I'd like to do instead of the last line is something like:
x += np.random.randn(*x.shape, dtype=x.dtype)
but randn
(and actually none of the numpy.random
methods) does not accept a dtype
argument.
My specific question is, is it possible to specify a dtype for random numbers when I create them, without having to call astype
? (My guess is that the random number generator is 64 bits long, so it doesn't really make sense to do this, but I thought I'd ask if it's possible.)
Q: is it possible to specify a dtype for random numbers when I create them.
A: No it isn't. randn accepts the shape only as randn(d0, d1, ..., dn)
Simply try this:
x = np.random.randn(10, 10).astype('f')
Or define a new function like
np.random.randn2 = lambda *args, **kwarg: np.random.randn(*args).astype(kwarg.get('dtype', np.float64))
x = np.random.randn2(10, 10, dtype='f')
If you have to use your code on the post, try this code instead
x = np.zeros((10, 10), dtype='f')
x[:] = np.random.randn(*x.shape)
This assigns the results of randn
to the memory allocated by np.zeros
Let me begin by saying that numpy now supports dtypes for random integers. This enhancement can be tracked through Issue #6790 on numpy's github. But as of today, this facility is not available for the gaussian RNG
. I needed this same facility so I wrote this patch for numpy, https://gist.github.com/se4u/e44f631b249e0be03c21c6c898059176
The patch only adds support for generating float
values and it does not handle other data types, but it might still be helpful to someone.
np.random.randn function randomly initializes the array object of a given shape to a "np.float64"
You can find this out yourself by doing as follows:
a = np.random.rand(2,3)
b = a[1,2]
print (type(b))
print (type(a))
output as follows:
<class 'numpy.float64'>
<class 'numpy.ndarray'>