Python numpy意外导致arange和linspace

时间:2017-09-13 07:09:26

标签: python python-2.7 numpy floating-point floating-accuracy

我需要创建一个方形网格,其中xy轴都具有以下参数:

min_range = 0
max_range = 0.8
cell_size = 0.01

我的所作所为:

import numpy as np
x_ax = np.arange(min_range, max_range, cell_size) ### This gives [0,...,0.1,...,0.29,0.79]
y_ax = np.arange(min_range, max_range, cell_size) ### This also gives [0,...,0.1,...,0.29,0.79]
### Cartesian product
lattice = np.transpose([np.tile(x_ax, y_ax.shape[0]), np.repeat(y_ax, x_ax.shape[0])])

然后,lattice矩阵作为参数传递给另一个函数,并为每个单元格赋值。我需要使用存储在单独数组中的指定值来可视化此网格。所以我所做的是:

lattice = np.asarray(lattice/cell_size,dtype=np.int32) ###This is supposed to contain matrix indices.

这就是我得到奇怪结果的地方。 lattice矩阵中的某些值,例如0.29除以0.01cell_size28。我无法弄清楚这个问题的来源,因为它只发生在预期范围内的一些值。我怀疑是here提到的浮点数的舍入问题,并且也用np.linspace进行了尝试。但这也没有帮助。

如何使此可视化工作正常?

1 个答案:

答案 0 :(得分:2)

在Python控制台中,您将看到

>>> 0.29/0.01
28.999999999999996
>>> import numpy as np
>>> np.int32(0.29/0.01)
28

所以你走在正确的道路上。这是由浮点计算引起的。只要将其转换为np.int32,小数位将被截断,结果为28。你应该对结果进行舍入,而不仅仅是强制转换:

>>> np.int32(np.round(0.29/0.01))
29

对于您的应用程序,这意味着您必须编写

lattice = np.asarray(np.round(lattice/cell_size),dtype=np.int32) ###This is supposed to contain matrix indices.