numpy中dtype =和.astype()有什么区别?

bob*_*obo 2 numpy python-3.x

上下文:我想numpy ndarraysfloat32而不是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)

hpa*_*ulj 6

让我们看看我能否解决一些我在评论中看到的困惑.

制作一个数组:

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.目的是避免舍入误差.但我不知道你是如何从文档或测试中找到的.