2

由于某种原因,浮点 numpy 数组的简单舍入似乎不起作用。

我从读取一个巨大的 img (形状为 (7352, 7472))中得到了 numpy 数组。防爆值:

>>> imarray[3500:3503, 5000:5003]
array([[ 73.33999634,  73.40000153,  73.45999908],
       [ 73.30999756,  73.37999725,  73.43000031],
       [ 73.30000305,  73.36000061,  73.41000366]], dtype=float32)

对于舍入,我一直在尝试使用 numpy.around() 作为原始值,还将值写入新数组,原始数组的副本,但由于某种原因没有结果..

arr=imarray
numpy.around(imarray, decimals=3, out=arr)
arr[3500,5000] #results in 73.3399963379, as well as accessing imarray

所以,精度更高!!!是因为这么大的阵型吗?

我需要对其进行四舍五入以获得最频繁的值(模式),并且我正在搜索 vay 以避免越来越多的库..

4

2 回答 2

4

你的数组有 dtype float32。那是一个 4 字节的浮点数。使用可表示的最接近 73.340 的浮点数float32大约是 73.33999634:

In [62]: x = np.array([73.33999634, 73.340], dtype = np.float32)

In [63]: x
Out[63]: array([ 73.33999634,  73.33999634], dtype=float32)

所以我认为np.around四舍五入是正确的,只是你dtype的粒度太大而无法四舍五入到你可能期望的数字。

In [60]: y = np.around(x, decimals = 3)

In [61]: y
Out[61]: array([ 73.33999634,  73.33999634], dtype=float32)

然而,如果 dtype 是np.float64

In [64]: x = np.array([73.33999634, 73.340], dtype = np.float64)

In [65]: y = np.around(x, decimals = 3)

In [66]: y
Out[66]: array([ 73.34,  73.34])

请注意,即使y显示 73.34 的打印表示,实数 73.34 也不一定完全可以表示为 float64。float64 表示可能非常接近 73.34,以至于 NumPy 选择将其打印为 73.34。

于 2012-09-20T13:19:17.510 回答
2

The answer by @unutbu is absolutely correct. Numpy is rounding it as close to the number as it can given the precision that you requested. The only thing that I have to add is that you can use numpy.set_printoptions to change how the array is displayed:

>>> import numpy as np
>>> x = np.array([73.33999634, 73.340], dtype = np.float32)
>>> y = np.round(x, decimals = 3)
>>> y
array([ 73.33999634,  73.33999634], dtype=float32)
>>> np.set_printoptions(precision=3)
>>> y
array([ 73.34,  73.34], dtype=float32)
于 2012-09-20T13:23:02.630 回答