gpt4 book ai didi

python - Numpy 将 float32 转换为 float64

转载 作者:太空宇宙 更新时间:2023-11-04 09:55:43 41 4
gpt4 key购买 nike

我想在 python 3 中对 numpy float32 数组执行一些标准操作,但是在使用 numpy sum() 时我看到了一些奇怪的行为。这是一个示例 session :

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 维数组)时,结果数据类型完全由输入数据类型确定。对于仅涉及(正维)数组的操作也是如此。

但是,当标量和(正维)数组混合时,NumPy 不使用标量的实际 dtype,而是检查标量的值以查看“较小”的 dtype 是否可以容纳它们,然后使用该 dtype用于类型提升。 (数组不会经历这个过程,即使它们的值适合较小的 dtype。)

因此,

np.sum(a)+1

是标量运算,将 1 转换为 dtype int_ 的 NumPy 标量(int32 或 int64 取决于 C long 的大小)然后根据数据类型 float32 和 int32/int64 执行提升,但是

a+1

涉及到一个数组,所以为了推广目的,1的数据类型被视为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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45949263/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com