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

lmj*_*ns3 22 python random numpy 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')
Run Code Online (Sandbox Code Playgroud)

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

x += np.random.randn(*x.shape, dtype=x.dtype)
Run Code Online (Sandbox Code Playgroud)

randn(实际上没有一个numpy.random方法)不接受dtype参数.

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

eme*_*eth 23

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

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

试试这个:

x = np.random.randn(10, 10).astype('f')
Run Code Online (Sandbox Code Playgroud)

或者定义一个新的功能

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

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

x = np.zeros((10, 10), dtype='f')
x[:] = np.random.randn(*x.shape)
Run Code Online (Sandbox Code Playgroud)

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


Pus*_*dre 8

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

该补丁仅增加了对生成float值的支持,不处理其他数据类型,但它可能仍然对某些人有帮助。

2020 年 9 月 27 日更新

numpy.random.Generator提供了支持的RNGdtype所有随机变量的关键字。例如numpy.random.default_rng().standard_normal(size=1, dtype='float32')给出1类型的标准高斯float32