生成随机值时,我可以指定numpy dtype吗?

时间:2014-04-29 04:23:53

标签: python numpy random floating-point-precision

我正在创建一个numpy个随机值数组,并将它们添加到包含32位浮点数的现有数组中。我想使用与目标数组相同的dtype生成随机值,这样我就不必手动转换dtypes。目前我这样做:

import numpy as np

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

我想做的不是最后一行,而是:

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

但是randn(实际上没有numpy.random方法)不接受dtype参数。

我的具体问题是,是否可以在创建随机数时指定dtype,而无需调用astype? (我的猜测是随机数生成器是64位长,所以这样做没有意义,但我想我会问是否可能。)

3 个答案:

答案 0 :(得分:23)

  

问:我可以在创建随机数时为其指定dtype。

     答:不,不是。 randn仅将形状接受为randn(d0,d1,...,dn)

试试这个:

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

或定义一个新功能,如

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

如果您必须在帖子上使用您的代码,请尝试使用此代码

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

这会将randn的结果分配给np.zeros

分配的内存

答案 1 :(得分:3)

首先让我说numpy现在支持随机整数的dtypes。可以通过numpy的github上的Issue #6790跟踪此增强功能。但截至今天,此设施不适用于gaussian RNG。我需要这个相同的工具,所以我为numpy,https://gist.github.com/se4u/e44f631b249e0be03c21c6c898059176

编写了这个补丁

该修补程序仅添加了对生成float值的支持,但它不处理其他数据类型,但它可能对某人有用。

答案 2 :(得分:0)

np.random.randn函数将给定形状的数组对象随机初始化为“np.float64” 您可以通过以下方式自行找到:

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

输出如下:

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