2

浮動小数点numpy配列の単純な丸めは、何らかの理由で機能していないようです。

巨大なimg((7352、7472)の形)を読み取ることでnumpy配列を取得します。Ex値:

>>> 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])

ショー73.34の印刷表現であってもy、実数73.34がfloat64として正確に表現できるとは限らないことに注意してください。float64表現はおそらく73.34に非常に近いため、NumPyは73.34として出力することを選択します。

于 2012-09-20T13:19:17.510 に答える
2

@unutbuによる答えは絶対に正しいです。Numpyは、要求された精度を与えることができる限り、数値に近い値を丸めています。追加する必要があるnumpy.set_printoptionsのは、配列の表示方法を変更するために使用できることだけです。

>>> 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 に答える