0

dtypenumpy配列を作成するとき、私はかなり混乱しています。フロートのリストから作成しています。最初に、私がすでに行ったので、それは印刷の問題ではないことに注意させてください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.allcloseTrueが返されます。

In [65]: np.allclose(boundary2, boundary4)
Out[65]: True

したがって、これまで読んだことがあるなら、なぜ私が混乱しているのか、そしておそらく次の2つの質問に答えられる人がいるのかを理解していただければ幸いです。

  1. なぜdtype=float32私のデータを「隠す」のですか?
  2. 心配する必要がありますか、それとも安全に使い続けることができdtype=floatますか?
4

1 に答える 1

4

すべての浮動小数点タイプの精度には制限があります。保存できる有効桁数は、浮動小数点型のビット数によって異なります。を指定した場合floatnumpy.floatまたはnumpy.float64としてdtype、64ビットが使用され(「倍精度」)、約16桁の10進数になります。の場合numpy.float32、32ビットが使用され(「単精度」)、約8桁の10進数になります。したがって、「隠されている」ものは何もありません。浮動小数点の精度が制限されている場合の影響がわかります。 選択した浮動小数点タイプの制限内ですべての値が近いため、がnumpy.allclose()返されます。True

于 2012-06-08T15:03:26.020 に答える