创建numpy数组时,我对dtype
感到困惑。我是从浮动列表中创建它们的。首先让我注意,这不是打印问题,因为我已经做过:np.set_printoptions(precision=18)
。
这是我的清单的一部分:
In [37]: boundary
Out[37]:
[['3366307.654296875', '5814192.595703125'],
['3366372.2244873046875', '5814350.752685546875'],
['3366593.37969970703125', '5814844.73492431640625'],
['3367585.4779052734375', '5814429.293701171875'],
['3367680.55389404296875', '5814346.618896484375'],
....
[ 3366307.654296875 , 5814192.595703125 ]]
然后我将它转换为numpy数组:
In [43]: boundary2=np.asarray(boundary, dtype=float)
In [44]: boundary2
Out[44]:
array([[ 3366307.654296875 , 5814192.595703125 ],
[ 3366372.2244873046875 , 5814350.752685546875 ],
[ 3366593.37969970703125, 5814844.73492431640625],
....
[ 3366307.654296875 , 5814192.595703125 ]])
# the full number of significant digits is preserved.
# this also works with:
In [45]: boundary2=np.array(boundary, dtype=float)
In [46]: boundary2
Out[46]:
array([[ 3366307.654296875 , 5814192.595703125 ],
[ 3366372.2244873046875 , 5814350.752685546875 ],
[ 3366593.37969970703125, 5814844.73492431640625],
...
[ 3366307.654296875 , 5814192.595703125 ]])
# This also works with dtype=np.float
In [56]: boundary3=np.array(boundary, dtype=np.float)
In [57]: boundary3
Out[57]:
array([[ 3366307.654296875 , 5814192.595703125 ],
[ 3366372.2244873046875 , 5814350.752685546875 ],
[ 3366593.37969970703125, 5814844.73492431640625],
....
[ 3366307.654296875 , 5814192.595703125 ]])
这就是为什么我感到困惑,如果我使用dtype=np.float32
似乎就像我失去了有效数字:
In [58]: boundary4=np.array(boundary, dtype=np.float32)
In [59]: boundary4
Out[59]:
array([[ 3366307.75, 5814192.5 ],
[ 3366372.25, 5814351. ],
[ 3366593.5 , 5814844.5 ],
[ 3367585.5 , 5814429.5 ],
...
[ 3366307.75, 5814192.5 ]], dtype=float32)
我说似乎的原因是因为显然阵列是相同的。我无法直接看到数据,但使用np.allclose
检查会返回True:
In [65]: np.allclose(boundary2, boundary4)
Out[65]: True
所以,如果你读到目前为止,我希望你明白为什么我感到困惑,也许有人可以回答以下两个问题:
dtype=float32
“隐藏”我的数据?dtype=float
?答案 0 :(得分:4)
所有浮点类型的精度都有限。它们可以存储的有效位数取决于浮点类型中的位数。如果您将float
,numpy.float
或numpy.float64
提供为dtype
,则会使用64位(“双精度”),从而产生大约16位有效十进制数字。对于numpy.float32
,使用32位(“单精度”),产生大约8个有效十进制数字。所以没有什么是“隐藏的”,你只是看到有限的浮点精度的影响。 numpy.allclose()
返回True
,因为所有值都接近您选择的浮点类型的限制。