6

誰かがこの丸めの問題を説明できnumpy.linspaceますか?

import numpy as np

np.linspace(0, 1, 6) == np.around( np.linspace(0, 1, 6), 10 )
# array([ True,  True,  True, False,  True,  True], dtype=bool)

これが私がここに到着した方法です...

import numpy as np

## Two ways of defining the same thing
A = np.array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])
B = np.linspace(0, 1, 6)

## A and B appear to be the same
A # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])
B # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])


## They're not
A == B # array([ True, True, True, False, True, True], dtype=bool)
A - B  # array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -1.11022302e-16, 0.00000000e+00, 0.00000000e+00])


## Gotta round to get my expected result
C = np.round( np.linspace( 0, 1, 6 ), 10 )
C      # array([ 0., 0.2, 0.4, 0.6, 0.8, 1. ])
A == C # array([ True, True, True, True, True, True], dtype=bool)

私が定義した方法はB十分に無実のようです。。。この丸めの問題は、私たちをいたるところに食い込ませることができるものですか?

4

1 に答える 1

7

きれいではありませんが、浮動小数点のように、それと一緒に暮らすことを学ぶ必要があります。これはあなたの奇妙な結果が由来するところです:

>>> a = np.float(1)
>>> a /= 5
>>> a
0.2
>>> a*3
0.6000000000000001

この種の問題に対処するのを手伝う必要がありますnp.allcloseが、浮動小数点の比較について訓練されていない場合は、そうです、それは何度も何度もあなたを噛みます。

于 2013-02-05T21:56:00.303 に答える