20

arange関数を使用して、forループの反復を定義し、予期しない結果を取得しています。

i = arange(7.8,8.4,0.05)
print i

次のようになります。

[ 7.8   7.85  7.9   7.95  8.    8.05  8.1   8.15  8.2   8.25  8.3   8.35 8.4 ]

ただし、次のように停止値8.35を使用します

i = arange(7.8,8.35,0.05)

次のようになります

[ 7.8   7.85  7.9   7.95  8.    8.05  8.1   8.15  8.2   8.25  8.3 ]

しかし、私は私の範囲を8.35で終わらせたいです!停止値>8.35および<8.4を使用して結果を達成できることはわかっていますが、なぜそれが異なり、私の心の中で一貫性がないのですか?

編集:私はバージョン2.7を使用しています

4

5 に答える 5

25

浮動小数点の丸めの効果が見られていると思います。

numpy.arangePythonと同じことをしますrange:「エンドポイント」は含まれていません。(たとえば、の代わりにrange(0, 4, 2)降伏します)[0,2][0,2,4]

ただし、浮動小数点ステップの場合、丸め誤差が累積され、最後の値に実際に端点が含まれる場合があります。

のドキュメントに記載されているようにarange

0.1などの非整数ステップを使用する場合、結果は一貫性がないことがよくあります。linspaceこれらの場合に使用することをお勧めします。

numpy.linspace開始点と終了点の間に指定された数の点を生成します。ちなみに、デフォルトではエンドポイントが含まれています。

于 2012-04-04T12:52:47.120 に答える
13

おそらく、浮動小数点数の制限に関係しています。マシンの精度により、考えられるすべての値を浮動小数点として完全に格納することはできません。例えば:

>>> 8.4
8.4000000000000004
>>> 8.35
8.3499999999999996

したがって、浮動小数点としての8.4は、実際の値8.4よりもわずかに大きくなりますが、浮動小数点としての8.35はわずかに小さくなります。

于 2012-04-04T12:57:30.153 に答える
4

アレンジ関数の助けは言う

    For floating point arguments, the length of the result is
    ``ceil((stop - start)/step)``.  Because of floating point overflow,
    this rule may result in the last element of `out` being greater
    than `stop`.

Python 2.7の場合、浮動小数点数と文字列の間の変換は、ほとんどのプラットフォームで正しく丸められるようになりました。

2.7で

>>> float(repr(2.3))
2.3

2.6で

>>> float(repr(2.3))
2.2999999999999998
于 2012-04-04T12:54:08.380 に答える
2

私は同じ問題を抱えていて、numpy.arangeでこの丸めの問題を修正するために独自の関数を実装しました:

import numpy as np
def my_arange(a, b, dr, decimals=6):
    res = [a]
    k = 1
    while res[-1] < b:
        tmp = round(a + k*dr,decimals)
        if tmp > b:
            break   
        res.append(tmp)
        k+=1

    return np.asarray(res)
于 2017-05-31T13:31:23.030 に答える
1

エンドポイントにコッレクトルフロートを少し追加します。

import numpy as np

step = 0.05
corr = 0.01 if step == 0.05 else 0.0

i = np.arange(7.8,8.35+corr,step)
print(i)

出力:

$ python a.py [7.8 7.85 7.9 7.95 8. 8.05 8.1 8.15 8.2 8.25 8.3 8.35]

于 2021-03-15T15:44:36.417 に答える