有和没有指定dtype的numpy.array表现得很奇怪

时间:2017-08-16 04:11:57

标签: python arrays numpy

我对此感到十分困惑。

来自以下

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。这就是我理解它的方式。它是否正确?。但我仍然对这种行为感到惊讶。

问题:这到底发生了什么?

1 个答案:

答案 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的问题,因为浮点数在内存中没有精确的表示(只有近似的一个),这说明了你看到的不精确。