由于某种原因,浮点numpy数组的简单舍入似乎不起作用。。
我通过读取一个巨大的img(形状为(73527472))得到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以避免越来越多的库。。
最佳答案
您的数组具有dtypefloat32
。这是一个4字节的浮点。
使用float32
表示的最接近73.340的浮动大约为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。关于python - 使用python从img读取的四舍五入的numpy浮点数组,返回的值未四舍五入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12513355/