2017-10-10 3 views
0

다음 스니 j에서는 128.99이 출력에 포함되며, 정의에 따라 출력되지 않아야합니다. 그게 버그 야? python2와 python3으로 테스트되었습니다.`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

그것은 부동의 관점에 따라, 포인트가 포함입니다 이제 "중지"주의 : 당신이 MGRID의 항목 수에 의존하는 경우

, 복잡한 단계 인덱스를 사용합니다. 반올림 오류는 정상입니다. 부동 소수점 범위를 원한다면'linspace' 또는'mgrid'의 복잡한 단계 형식을 사용해야합니다. – user2357112

답변

2

np.mgrid 두 개의 인수로 호출하면 처음부터 끝까지 항목이있는 해당 범위가 채워집니다. 단계는 기본적으로 1이다

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

:

은 단계의 수이며, 사용되는 화학식 ( source 참조)를 결정한다. 귀하의 상황에서 stop-start은 9.000000000000014이므로 반올림하여 ceil 함수는 1 단계의 10 단계를 생성합니다. 119.99 + 9 = 128.99

그래서 버그가 없습니다.

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

docs

+0

요약하면, 문제는 1)'float' 표현의 반올림 오류 2)'ceil' 함수에 의해 정수 단계가 생성됩니다. 따라서 매우 작은 반올림 오류로 인해 단계 수가 달라질 수 있습니다. 추신 :'decimal.Decimal()'은'float'의 정확한 값을 검사하는 데 사용할 수 있습니다. – beaver