Python 带和不带指定dtype的numpy.array行为奇怪

Python 带和不带指定dtype的numpy.array行为奇怪,python,arrays,numpy,Python,Arrays,Numpy,我对此完全感到困惑 从下面 import numpy as np a = np.array([4, -9]) a[0] = 0.4 a I预期输出:数组([0.4,-9])。但它给了我 数组([0,-9]) 但是当我将dtype更改为f a = np.array([4, -9], 'f') a[0] = 0.4 a 它给出了数组([0.40000001,-9.],dtype=float32)的预期输出 numpy.array(object,dtype=None,copy=True,orde

我对此完全感到困惑

从下面

import numpy as np

a = np.array([4, -9])
a[0] = 0.4
a
I预期输出:
数组([0.4,-9])
。但它给了我

数组([0,-9])

但是当我将
dtype
更改为
f

a = np.array([4, -9], 'f')
a[0] = 0.4
a
它给出了
数组([0.40000001,-9.],dtype=float32)的预期输出

numpy.array(object,dtype=None,copy=True,order='K',subok=False,ndmin=0)的文档说明:

数据类型:数据类型,可选 阵列所需的数据类型。如果未给出,则类型将被确定为在序列中保存对象所需的最小类型。此参数只能用于“向上投射”数组。对于向下广播,请使用.astype(t)方法

当我初始化数组时,它将值初始化为
整数
,因此当我使用
浮点
对数组进行索引时,它只识别
整数
部分
0.4
,因此给了我
0
。这就是我的理解。这是正确的吗?。但我仍然对这种行为感到惊讶


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

问题是您的数组是
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) 

至于
数组([0.40000001,-9.]
0.4
)的问题,因为浮点数在内存中没有精确的表示形式(只有近似值),这就解释了你所看到的不精确性。

非常好。这就解决了问题。显然,我还有很多东西要学。我不喜欢使用
dtype=object
来保存浮点数和整数的想法。如果需要的话,混合字符串和数字可以,或者保存列表之类的东西更好。但是对于纯数字数据,最好使用使用数字数据类型。@hpaulj接受。使用非数字类型,您将失去所有矢量化的好处。什么是数字
dtype
,可以完成这项工作?
float
d?
?@JackDawkins我认为最重要的问题是您希望将整数和float存储在一起。如果您想这样做,这就是how、 但我们给你的建议是:不要这样做。