我对此感到十分困惑。
来自以下
import numpy as np
a = np.array([4, -9])
a[0] = 0.4
a
我预期输出: array([ 0.4, -9])
。但它给了我
array([ 0, -9])
。
但是当我将dtype
更改为f
a = np.array([4, -9], 'f')
a[0] = 0.4
a
它给了我预期的array([ 0.40000001, -9. ], dtype=float32)
numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
的文档说:
dtype:数据类型,可选 数组所需的数据类型。如果没有给出,那么类型将被确定为保持序列中的对象所需的最小类型。此参数只能用于“upcast”数组。对于向下转换,请使用.astype(t)方法。
当我初始化数组时,它将值初始化为integers
,因此当我使用float
对数组建立索引时,它只识别integer
的{{1}}部分,因此给了我0.4
。这就是我理解它的方式。它是否正确?。但我仍然对这种行为感到惊讶。
问题:这到底发生了什么?
答案 0 :(得分:1)
问题是您的数组是dtype=np.int64
:
In [141]: a = np.array([4, -9])
In [142]: a.dtype
Out[142]: dtype('int64')
这意味着您只能存储整数,并且在分配完成之前会截断任何浮点数。如果要将浮点数和整数存储在一起,则应首先指定dtype=object
:
In [143]: a = np.array([4, -9], dtype=object)
In [144]: a[0] = 0.4
In [145]: a
Out[145]: array([0.4, -9], dtype=object)
至于array([ 0.40000001, -9. ]
,0.4
的问题,因为浮点数在内存中没有精确的表示(只有近似的一个),这说明了你看到的不精确。