gpt4 book ai didi

python-3.x - numpy 中的 dtype= 和 .astype() 有什么区别?

转载 作者:行者123 更新时间:2023-12-01 02:25:35 26 4
gpt4 key购买 nike

上下文:我想使用 numpy ndarraysfloat32而不是 float64 .

编辑:附加上下文 - 我担心如何 numpy正在执行这些调用,因为它们将作为神经网络中反向传播程序的一部分重复发生。我希望网络在 float32 中执行所有加法/减法/乘法/除法出于验证目的,因为我想将结果与另一组的工作进行比较。看起来像 randn 之类的方法的初始化将永远来自 float64 -> float32.astype()铸件。曾经我的 ndarray类型为 float32如果我使用 np.dot例如,这些乘法会发生在 float32 中吗? ?如何验证?

我不清楚文档 - http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html

我想我可以添加 .astype('float32')到 numpy 调用的末尾,例如,np.random.randn(y, 1).astype('float32') .

我也看到 dtype=np.float32是一个选项,例如,np.zeros(5, dtype=np.float32) .但是,尝试 np.random.randn((y, 1), dtype=np.float32)返回以下错误:

    b = np.random.randn((3,1), dtype=np.float32)
TypeError: randn() got an unexpected keyword argument 'dtype'

将类型声明为 float32 有什么区别?使用 dtype并使用 .astype() ?

两者 b = np.zeros(5, dtype=np.float32)b = np.zeros(5).astype('float32')评估时:
print(type(b))
print(b[0])
print(type(b[0]))

打印:
[ 0.  0.  0.  0.  0.]
<class 'numpy.ndarray'>
0.0
<class 'numpy.float32'>

最佳答案

让我们看看我是否可以解决我在评论中看到的一些困惑。
制作一个数组:

In [609]: x=np.arange(5)
In [610]: x
Out[610]: array([0, 1, 2, 3, 4])
In [611]: x.dtype
Out[611]: dtype('int32')
arange 的默认值是制作一个int32。 astype是一个数组方法;它可以用于任何数组:
In [612]: x.astype(np.float32)
Out[612]: array([ 0., 1., 2., 3., 4.], dtype=float32)
arange还需要一个 dtype范围
In [614]: np.arange(5, dtype=np.float32)
Out[614]: array([ 0., 1., 2., 3., 4.], dtype=float32)
是先创建 int 数组并对其进行转换,还是直接创建 float32 对我来说无关紧要。这是一个基本操作,在编译后的代码中完成。
我也可以给它一个 float stop值,在这种情况下,它会给我一个浮点数组——默认的浮点类型。
In [615]: np.arange(5.0)
Out[615]: array([ 0., 1., 2., 3., 4.])
In [616]: _.dtype
Out[616]: dtype('float64')
zeros类似;默认的 dtype 是 float64,但是我可以通过一个参数来改变它。由于它的主要任务是分配内存,并且不必进行任何计算,因此我确信它会立即创建所需的 dtype,无需进一步转换。但同样,这是编译后的代码,我不必担心它在幕后做了什么。
In [618]: np.zeros(5)
Out[618]: array([ 0., 0., 0., 0., 0.])
In [619]: _.dtype
Out[619]: dtype('float64')
In [620]: np.zeros(5,dtype=np.float32)
Out[620]: array([ 0., 0., 0., 0., 0.], dtype=float32)
randn涉及大量计算,显然它被编译为使用默认浮点类型。它不需要 dtype。但由于结果是一个数组,所以可以用 astype 进行转换.
In [623]: np.random.randn(3)
Out[623]: array([-0.64520949, 0.21554705, 2.16722514])
In [624]: _.dtype
Out[624]: dtype('float64')
In [625]: __.astype(np.float32)
Out[625]: array([-0.64520949, 0.21554704, 2.16722512], dtype=float32)
让我强调一下 astype是一个数组的方法。它获取数组的值并生成一个具有所需 dtype 的新数组。它不会对数组本身或创建该数组的函数进行追溯(或就地)操作。 astype的效果通常(总是?)与 dtype 相同参数,但 Action 顺序不同。
https://stackoverflow.com/a/39625960/901925我描述了一个采用 dtype 的稀疏矩阵创建器参数,并用 astype 实现它最后调用方法。
当您进行诸如 dot 之类的计算时或 * ,它尝试将输出 dtype 与输入匹配。在混合类型的情况下,它采用更高精度的替代方案。
In [642]: np.arange(5,dtype=np.float32)*np.arange(5,dtype=np.float64)
Out[642]: array([ 0., 1., 4., 9., 16.])
In [643]: _.dtype
Out[643]: dtype('float64')
In [644]: np.arange(5,dtype=np.float32)*np.arange(5,dtype=np.float32)
Out[644]: array([ 0., 1., 4., 9., 16.], dtype=float32)
有类型转换规则。查找这些的一种方法是使用 can_cast功能:
In [649]: np.can_cast(np.float64,np.float32)
Out[649]: False
In [650]: np.can_cast(np.float32,np.float64)
Out[650]: True
在某些计算中,它可能会将 32 转换为 64,进行计算,然后转换回 32。目的是避免舍入错误。但我不知道你是如何从文档或测试中发现的。

关于python-3.x - numpy 中的 dtype= 和 .astype() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39623429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com