umpy:在添加一个数字时,如何保留一半精度数组标量输入的数据类型

问题描述 投票:0回答:3
x = np.float32(3)

。我想添加一个:

y = x + 1
。但是,
y
将是float64而不是float32。
我只能想到两个解决方法:

将输入转换为1D数组:

x = np.float32([3])
    使得
  • y = x + 1
    是float32
    将1转化为较低的精度:
    y = np.float32(3) + np.float16(1)
  • 是float32
  • ,无论如何,我有很多功能,因此上述修复程序要求我在每个功能中添加IF-ELSE语句...有什么更好的方法吗?谢谢!

您可以使用
python numpy
3个回答
1
投票
如下:

>>> res = np.add(np.array([3], dtype=np.float32), np.float16(1), dtype=np.float64)
>>> res
array([4.])

>>> res.dtype
dtype('float64')

您注意到,在标量数组中添加python值会返回一个默认dtype的值:

0
投票
In [188]: np.float32(1.0) + 1 Out[188]: 2.0 In [189]: type(_) Out[189]: numpy.float64

为什么关心这个dtype?
如果将标量添加到数组中,则保留了dtype。
In [190]: np.array([1.0], 'float32')+1 Out[190]: array([2.], dtype=float32)

我对使用

np.float32(..)

而不是制作数组的代码可疑。 通常,我们担心大型数组的dtype,而不是单个术语 - 尤其是在重点是内存使用的情况下。

获取
np.float32
对象最自然的情况是当我们提取数组的元素时:

In [193]: type(np.array([1.0], 'float32')[0])
Out[193]: numpy.float32
保留type的是两个术语的类型相同

In [196]: type(np.float32(12)+np.float32(34)) Out[196]: numpy.float32

是将标量转换为numpy,它创建了
float64

In [198]: np.array(1.0).dtype
Out[198]: dtype('float64')

您观察到的是类型促销。一个结果
涉及不同类型的二进制操作被“促进”到更高
精度类型。促销规则在numpy 2.0和
您显示的行为再也无法观察到:

In [15]: np.float32(3) + 1
Out[15]: np.float32(4.0)
the the the numpy文档中指定了这一点:

由于Numpy 2.0 [2],我们促销规则的重要一点是
尽管涉及两个Numpy Dtypes的操作永远不会丢失
精度,涉及数字dtype和python标量的操作
(int,float或复杂)可能会失去精度。例如,它是
可能是直观的,这是python之间操作的结果
整数和numpy整数应该是一个数字整数。然而,
python整数具有任意精度,而所有numpy dtypes
具有固定的精度,因此Python整数的任意精度
不能保留

0
投票
numpy通常考虑了python标量的“种类”,但是 确定结果dtype时忽略其精度。这是 通常方便。

,例如,使用低的数组 精确的dtype,通常需要使用 python标量以保留dtype。

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.