我可以在生成随机值时指定一个 numpy dtype 吗?

Posted

技术标签:

【中文标题】我可以在生成随机值时指定一个 numpy dtype 吗?【英文标题】:Can I specify a numpy dtype when generating random values? 【发布时间】:2014-06-14 20:18:36 【问题描述】:

我正在创建一个 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 位长,所以这样做并没有什么意义,但我想我会问是否可能。)

【问题讨论】:

numpy 会自动将随机数组的类型转换为x 的类型,当您执行就地操作时,绝对不需要astype,只需执行x += np.random.randn(*x.shape),并且亲眼看看x.dtype 没有改变。 【参考方案1】:

问:是否可以在创建随机数时为它们指定 dtype。

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

试试这个:

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

或者定义一个新的函数,比如

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

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

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

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

【讨论】:

这不适用于标量的情况(例如 randn()),因为 randn 将返回浮点数值类型,而不是数组 - 否则,基本上我也是这样做的 这似乎不适用于 .astype('i') 因为它给出了一个所有元素都为 0 的矩阵。 你也可以在 astype 中使用通常的 np.float32 或 np.int @jkhosla 整数对我来说很好用。请注意,其中约 68% 将为零。即它会将值截断为零,因此只有约 16% 的分布会小于 -1 和约 16% 高于 +1【参考方案2】:

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

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

2020 年 9 月 27 日更新

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

【讨论】:

【参考方案3】:

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'>

【讨论】:

以上是关于我可以在生成随机值时指定一个 numpy dtype 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在numpy的范围内生成随机日期

利用Python数据分析-Numpy和Pands篇

基于numpy的随机数构造

NumPy基础:随机数生成

python基础2:随机数生成—random模块、numpy中的random函数

python之随机数生成方法汇总