生成随机值时可以指定numpy数据类型吗?

48 投票
4 回答
45438 浏览
提问于 2025-04-18 04:41

我正在创建一个包含随机值的 numpy 数组,并将这些值添加到一个已经存在的包含32位浮点数的数组中。我希望生成的随机值和目标数组使用相同的数据类型,这样我就不需要手动转换数据类型。目前我这样做:

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 参数。

我具体想问的是,在创建随机数时,是否可以指定数据类型,而不需要调用 astype?(我猜测随机数生成器是64位的,所以这样做其实没有意义,但我还是想问问是否可能。)

4 个回答

-5

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

我想很多时候你可以直接使用 randint 这个函数,比如:

np.random.randint(low=0, high=256, size=(256,256,3), dtype=np.uint8)
11

首先要说的是,numpy现在支持生成随机整数的不同数据类型。这项功能可以在numpy的github上通过问题 #6790进行跟踪。不过截至目前,这个功能还不支持gaussian RNG。我也需要这个功能,所以我为numpy写了一个补丁,链接在这里:https://gist.github.com/se4u/e44f631b249e0be03c21c6c898059176

这个补丁只增加了生成float类型值的支持,其他数据类型暂时不处理,但可能对某些人还是有帮助的。

更新于2020年9月27日

numpy.random.Generator提供了支持dtype关键字的随机数生成器,可以用于所有随机变量。例如,numpy.random.default_rng().standard_normal(size=1, dtype='float32')会生成一个类型为float32的标准高斯随机数。

38

问:在创建随机数时,可以指定数据类型吗?

答:不可以。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 分配的内存。

撰写回答