Numpy casting float32 to float64



我想在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')

有什么原因是,将标量添加到总和的结果(似乎具有float32dtype)的结果会将其归还给float64吗?需要明确的是,我知道我可以明确地将标量施加到float32,但是如上一行所示,Numpy在将标量添加到数组时仍然尊重float32。任何解释或建议如何在不明确铸造的情况下将事物保持为float32

np.sum(a)的结果是numpy标量,而不是数组。仅涉及标量的操作使用涉及(正维)numpy阵列的操作的不同铸造规则,numpy.result_type的文档中描述了。

当操作仅涉及标量(包括0维数组)时,结果dtype纯粹由输入dtypes确定。仅涉及(正维)阵列的操作也是如此。

然而,当混合标量和(正维)阵列时,Numpy检查标量的值,以查看标量的值以查看"较小" dtype是否可以保持它们,然后使用该dtype用于类型促销。(即使数组的值适合较小的dtype,阵列也不会经历此过程。)

因此,

np.sum(a)+1

是标量操作,将1转换为DTYPE int_的Numpy标量(根据C长的大小,INT32或INT64),然后基于DTYPES FLOAT32和INT32/INT64进行促销,但是

a+1

涉及一个数组,因此1的DTYPE被视为INT8,以促销。

由于float32无法容纳所有dtype int32(或int64)的值,因此numpy升级到float64进行第一个促销。(float64不能容纳所有dtype int64的值,但是numpy不会促进numpy.longdouble。第二促销。

如果使用大于1的数字,则它不适合INT8:

In [16]: (a+1).dtype
Out[16]: dtype('float32')
In [17]: (a+1000000000).dtype
Out[17]: dtype('float64')

您可以看到不同的促销行为。

最新更新