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)
您可以使用
>>> res = np.add(np.array([3], dtype=np.float32), np.float16(1), dtype=np.float64)
>>> res
array([4.])
>>> res.dtype
dtype('float64')
您注意到,在标量数组中添加python值会返回一个默认dtype的值: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整数的任意精度
不能保留
,例如,使用低的数组 精确的dtype,通常需要使用 python标量以保留dtype。