2017-10-10 1 views
0

Dans l'extrait suivant, 128.99 est inclus dans la sortie, ce qui, par définition, ne doit pas l'être. Est-ce un bug? Testé avec python2 et python3.Bug possible de `np.mgrid`?

In [38]: np.mgrid[119.99:128.99, 0:2] 
Out[38]: 
array([[[ 119.99, 119.99], 
    [ 120.99, 120.99], 
    [ 121.99, 121.99], 
    [ 122.99, 122.99], 
    [ 123.99, 123.99], 
    [ 124.99, 124.99], 
    [ 125.99, 125.99], 
    [ 126.99, 126.99], 
    [ 127.99, 127.99], 
    [ 128.99, 128.99]], 

    [[ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ], 
    [ 0. , 1. ]]]) 
+2

« stop » Il est à virgule flottante. Les erreurs d'arrondi sont normales. Vous devriez utiliser 'linspace' ou la forme complexe de' mgrid' si vous voulez une plage à virgule flottante. – user2357112

Répondre

2

np.mgrid invoqué avec deux arguments rempliront la gamme correspondante avec les éléments du début à arrêter.

pour déterminer le nombre d'étapes, la formule utilisée est (voir la source):

math.ceil((key[k].stop - start)/(step*1.0)) 

où l'étape est 1 par défaut. Dans votre situation, stop-start est 9.000000000000014 de sorte que l'arrondi par la fonction ceil génère 10 étapes, de l'étape 1: 119.99 + 9 = 128.99

Donc, aucun bug ici.

Si vous comptez sur le nombre d'éléments dans MGRID, utilisez un index étape complexe:

np.mgrid[119.99:127.99:9j, 0:2]. 

méfiez-vous que maintenant le point est compris, par la docs

+0

En résumé, le problème est causé par 1) erreur d'arrondi de la représentation 'float' 2) nombre entier d'étapes est produite par la fonction' ceil'. Par conséquent, une très petite erreur d'arrondi peut entraîner un nombre de pas DIFFÉRENT. PS: 'decimal.Decimal()' peut être utilisé pour vérifier la valeur exacte d'un 'float' – beaver