上下文:我想numpy ndarrays用float32而不是float64.
编辑:附加上下文 - 我关心如何numpy执行这些调用,因为它们将作为神经网络中反向传播例程的一部分重复发生.我希望网络能够进行所有加法/减法/乘法/除法以float32进行验证,因为我想将结果与另一组的工作进行比较.对于类似方法的初始化似乎randn总是来自float64- > float32with .astype()cast.一旦我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'
Run Code Online (Sandbox Code Playgroud)
将类型声明为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]))
Run Code Online (Sandbox Code Playgroud)
打印:
[ 0. 0. 0. 0. 0.]
<class 'numpy.ndarray'>
0.0
<class 'numpy.float32'>
Run Code Online (Sandbox Code Playgroud)
让我们看看我能否解决一些我在评论中看到的困惑.
制作一个数组:
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')
Run Code Online (Sandbox Code Playgroud)
默认设置arange是生成int32.
astype是一种数组方法; 它可以在任何数组上使用:
In [612]: x.astype(np.float32)
Out[612]: array([ 0., 1., 2., 3., 4.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
arange也需要一个dtype参数
In [614]: np.arange(5, dtype=np.float32)
Out[614]: array([ 0., 1., 2., 3., 4.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
它是先创建int数组并转换它,还是直接创建float32对我来说没什么问题.这是一个基本操作,在编译代码中完成.
我也可以给它一个浮点stop值,在这种情况下它会给我一个浮点数组 - 默认的浮点类型.
In [615]: np.arange(5.0)
Out[615]: array([ 0., 1., 2., 3., 4.])
In [616]: _.dtype
Out[616]: dtype('float64')
Run Code Online (Sandbox Code Playgroud)
zeros类似; 默认的dtype是flort64,但是使用参数我可以改变它.由于它的主要任务是分配内存,而且不需要进行任何计算,我确信它会立即创建所需的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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
让我强调这astype是一种数组方法.它获取数组的值并生成具有所需dtype的新数组.它不会对数组本身或创建该数组的函数进行追溯(或就地)操作.
效果astype通常(总是?)与dtype参数相同,但动作的顺序是不同的.
在/sf/answers/2773817231/中,我描述了一个带有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)
Run Code Online (Sandbox Code Playgroud)
有铸造规则.查看它们的一种方法是使用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
Run Code Online (Sandbox Code Playgroud)
在某些计算中,它可以将32转换为64,进行计算,然后转换回32.目的是避免舍入误差.但我不知道你是如何从文档或测试中找到的.
| 归档时间: |
|
| 查看次数: |
19148 次 |
| 最近记录: |