【비보】모두가 빠지는 `np.arange()`의 함정

4777 단어 파이썬numpy

np.arange() 함정



Python을 사용하여 0.1마다 for 문을 돌리십시오 – Kaggle Note 」라고 하는 기사가 있었다.

for 문을 사용하여 소수점을 반복하고 싶을 때는 가끔 있습니다. 이번에는 그것을 실현하는 방법을 써 갑니다. 0~1을 0.1 단위로 반복하는 가정입니다.

그렇다.

기사에서는 「range를 사용하는 방법」과 「numpy를 사용하는 방법」이라고 내걸고 있다.

「range를 사용하는 방법」이란 다음과 같은 것이다.
def myrange():
    gen = range(0, 10, 1)
    return [i/10 for i in gen]


myrange()
# [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

이것은 문제없는 코드입니다.

계속해서, 「numpy를 사용하는 방법」으로서 이하와 같은 코드를 내건다.
import numpy as np


def myrange2():
    data = np.arange(0.0, 1.0, 0.1)
    data_round = np.round(data, 1)
    return [i for i in data_round]


myrange2()
# [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

이것은 하지 말라.

이번 '0~1을 0.1씩'의 경우 우연히 우연히 문제 없지만, 값이 바뀌면 이야기가 바뀐다.

「0~2.1을 0.3씩」을 해 본다.

우선은 "range를 사용하는 방법".
def myrange():
    gen = range(0, 21, 3)
    return [i/10 for i in gen]


myrange()
# [0.0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]

이것이 모범 해답.

「numpy를 사용하는 방법」에서는 이하와 같이 된다.
import numpy as np


def myrange2():
    data = np.arange(0.0, 2.1, 0.3)
    data_round = np.round(data, 1)
    return [i for i in data_round]


myrange2()
# [0.0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1]

알 수 있었을까. 종단이 잘못되어 있는 것이다.
np.arange() 의 스텝수에 소수를 주어서는 안 된다.

좋은 웹페이지 즐겨찾기