我可以在生成随机值时指定一个 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章