上下文:我想将numpy ndarrays
与float32
一起使用,而不是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
值,在这种情况下,它将给我一个float数组-默认的float类型。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
涉及大量计算,并且显然可以编译为使用默认的float类型。它不需要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
参数相同,但是操作顺序不同。在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/