numpy.array未指定dtype和指定dtype的行为奇怪

3
我很困惑这个问题。
以下内容是:

从下面的内容看

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: 数据类型,可选参数 数组所需的数据类型。如果没有给出,则类型将被确定为容纳序列中对象所需的最小类型。此参数仅用于“向上转型”数组。对于向下转型,请使用 .astype(t) 方法。

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

问题: 到底发生了什么?

1个回答

3
问题在于您的数组的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 作为浮点数在内存中没有精确的表示(只有近似值),这就解释了你看到的不精确性。

太好了,这解决了问题。显然,我还有很多要学习的。 - Kid Charlamagne
我不喜欢使用 dtype=object 来保存浮点数和整数的想法。如果需要混合字符串和数字,那么这样做是可以的,或者更好的方法是用于保存诸如列表之类的东西。但对于纯数值数据,最好使用数值 dtype。 - hpaulj
什么样的数字dtype能够完成这项工作?使用float?还是d - Kid Charlamagne
@JackDawkins 我认为总体问题在于你想要将整数和浮点数存储在一起。如果你想这么做,可以这样做。但是我们给你的建议是:不要这样做。 - cs95
@JackDawkins 要么是 [4, 9],要么是 [4.0, 9.0]。但不能半斤八两。 - cs95
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接