numpy数组元素会自动四舍五入吗?

7 投票
2 回答
7938 浏览
提问于 2025-04-17 17:28

我在Python里有一个包含浮点数的numpy数组。

当我打印这个数组时,第一个值是:

[7.14519700e+04, ....

但是,如果我单独打印第一个值,输出的结果是:

71451.9699799

显然,这两个数字应该是一样的,所以我在想,数组是不是只给我显示了这个元素的一个四舍五入的版本?这里第二个数字有12位有效数字,而第一个只有9位。

我只是想知道,为什么这两个数字会不一样呢?

2 个回答

4

在numpy数组中,数据类型是非常明确的。你可以通过查看数组的 numpy.dtype 属性来了解它们是如何存储的。

举个例子:

import numpy
a = numpy.zeros(10)
print a.dtype

这会显示 float64,也就是一个64位的浮点数。

你可以通过常用的dtype参数,或者dtype的 type 对象(也就是用来定义dtype的东西)来明确指定数组的数据类型。

a = numpy.zeros(10, dtype='complex32') # a 32-bit floating point
b = numpy.longdouble(a) # create a long-double array from a

关于打印输出,这只是格式化的问题。你可以通过 numpy.set_printoptions 来调整numpy打印数组的方式:

>>> a = numpy.random.randn(3) # for interest, randn annoyingly doesn't support the dtype arg
>>> print a
[ 0.12584756  0.73540009 -0.17108244 -0.96818512]
>>> numpy.set_printoptions(precision=3)
>>> print a
[ 0.126  0.735 -0.171 -0.968]
8

这只是打印出来的效果问题,不是存储的问题。可能会让人困惑的是,第一个例子用了numpy的打印精度设置,而第二个例子用了普通Python的打印设置。

你可以通过以下方式调整numpy的精度和打印:

numpy.set_printoptions(precision=20)
print myarray`

(根据你的需要调整精度),或者在标准Python格式化打印中选择有效数字的位数:

print ('%.20f' % myarray[0])

数字的内部表示方式始终是一样的。

撰写回答