生成随机值时可以指定numpy数据类型吗?
我正在创建一个包含随机值的 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 个回答
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'>
我想很多时候你可以直接使用 randint
这个函数,比如:
np.random.randint(low=0, high=256, size=(256,256,3), dtype=np.uint8)
首先要说的是,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
的标准高斯随机数。
问:在创建随机数时,可以指定数据类型吗?
答:不可以。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
分配的内存。