+-
![python – Numpy将float32转换为float64 python – Numpy将float32转换为float64](/img/no_img.png)
我想在 python 3中对numpy float32数组执行一些标准操作,但是在使用numpy sum()时我看到了一些奇怪的行为.这是一个示例会话:
Python 3.6.1 |Anaconda 4.4.0 (x86_64)| (default, May 11 2017, 13:04:09)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
import numpy as np
np.__version__
Out[3]: '1.12.1'
a = np.ones(10).astype(np.float32)
np.sum(a).dtype
Out[5]: dtype('float32')
(np.sum(a)+1).dtype
Out[6]: dtype('float64')
(np.sum(a)+1.).dtype
Out[7]: dtype('float64')
(a+1).dtype
Out[8]: dtype('float32')
为什么在一个sum的结果中添加一个标量(似乎有一个float32的dtype)的任何原因会将它强制转换为float64?要清楚,我知道我可以显式地将标量转换为float32,但是如最后一行所示,在向数组添加标量时,numpy仍然尊重float32.任何解释或建议如何保持float32没有显式铸造?
最佳答案
np.sum(a)的结果是NumPy标量,而不是数组.仅涉及标量的操作使用涉及(正维)NumPy数组的操作的不同转换规则,如
numpy.result_type
的文档中所述.
当操作仅涉及标量(包括0维数组)时,结果dtype完全由输入dtypes确定.对于仅涉及(正维)数组的操作也是如此.
但是,当标量和(正维)数组混合使用时,NumPy不会使用标量的实际dtypes,而是检查标量的值以查看“较小”的dtype是否可以保存它们,然后将该dtype用于该类型推广. (数组不会经历这个过程,即使它们的值适合较小的dtype.)
从而,
np.sum(a)+1
是一个标量操作,将1转换为dtype int_
的NumPy标量(int32或int64,具体取决于C long的大小),然后根据dtypes float32和int32 / int64执行提升,但是
a+1
涉及一个数组,因此为了促销的目的,将1的dtype视为int8.
由于float32无法保存dtype int32(或int64)的所有值,因此NumPy会在第一次促销时升级到float64. (float64不能保存dtype int64的所有值,但NumPy不会为此提升为numpy.longdouble.)由于float32可以保存dtype int8的所有值,因此NumPy会使用float32进行第二次促销.
如果使用大于1的数字,则它不适合int8:
In [16]: (a+1).dtype
Out[16]: dtype('float32')
In [17]: (a+1000000000).dtype
Out[17]: dtype('float64')
你可以看到不同的促销行为.
点击查看更多相关文章
转载注明原文:python – Numpy将float32转换为float64 - 乐贴网