Python 将列表转换为numpy数组时的数据类型用法

Python 将列表转换为numpy数组时的数据类型用法,python,arrays,numpy,Python,Arrays,Numpy,创建numpy数组时,我被dtype弄糊涂了。我从浮动列表中创建它们。首先让我注意到这不是打印问题,因为我已经做了:np.set\u printoptions(precision=18) 这是我清单的一部分: In [37]: boundary Out[37]: [['3366307.654296875', '5814192.595703125'], ['3366372.2244873046875', '5814350.752685546875'], ['3366593.379699707

创建numpy数组时,我被
dtype
弄糊涂了。我从浮动列表中创建它们。首先让我注意到这不是打印问题,因为我已经做了:
np.set\u 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
it就好像我失去了有效数字:

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

  • 所有浮点类型的精度都有限。它们可以存储的有效位数取决于浮点类型中的位数。如果您提供
    float
    numpy.float
    numpy.float64
    作为
    dtype
    ,则使用64位(“双精度”),产生大约16位有效十进制数字。对于
    numpy.float32
    ,使用32位(“单精度”),产生大约8位有效十进制数字。因此,没有什么是“隐藏的”,您只需看到有限浮点精度的效果
    numpy.allclose()
    返回
    True
    ,因为所有值都在所选浮点类型的限制范围内接近。

    所有浮点类型的精度都有限。它们可以存储的有效位数取决于浮点类型中的位数。如果您提供
    float
    numpy.float
    numpy.float64
    作为
    dtype
    ,则使用64位(“双精度”),产生大约16位有效十进制数字。对于
    numpy.float32
    ,使用32位(“单精度”),产生大约8位有效十进制数字。因此,没有什么是“隐藏的”,您只需看到有限浮点精度的效果
    numpy.allclose()
    返回
    True
    ,因为所有值都在所选浮点类型的限制范围内接近。

    您是否知道
    float
    表示64位浮点,而
    float32
    只有该精度的一半?@larsmans,不,我不知道。我一直在文档中搜索…@larsmans,刚刚找到它,thaks根据您的提示您是否知道
    float
    意味着64位浮点,而
    float32
    只有该精度的一半?@larsmans,不,我不知道。我一直在文档中搜索…@larsmans,刚刚找到它,感谢你的提示thaks,事实上,使用float 64,我在float上得到了相同的结果,精度非常高。现在,我甚至找到了正确的文档:谢谢,事实上,使用float64,我在float上得到了相同的结果,精度非常高。现在,我甚至找到了正确的文档: