본문 바로가기

Work

Python - numpy arange vs. linspace

거의 유사한 동작이며 목적도 비슷하다.

numpy.arange()
Values are generated within the half-open interval [`start`, `stop`)
numpy.linspace()
Returns `num` evenly spaced samples, calculated over the interval [`start`, `stop`].

 

print("arange:", np.arange(start=0, stop=6, step=1))
print("linspace:", np.linspace(start=0, stop=6, num=7))
결과:
arange: [0 1 2 3 4 5] 
linspace: [0. 1. 2. 3. 4. 5. 6.]

linspace의 num은 '분할점의 개수'이다. 여기엔 start와 stop 값이 포함된다. 함수명이 linear space처럼 보이는데, 입력 요소가 '분할구간 개수'가 아니라는 건 다소 직관적이지 않은 느낌이다.

그리고 linspace는 분할점 위치가 정수로 딱 떨어져도 소숫점 표기방식을 갖는다. arange()는 start/stop/step 중 하나라도 소숫점을 표기하면 생성 결과 값들도 소숫점을 가진다. 그러나 Python에선 어떤 값이 소숫점을 갖는지가 거의 의미 없다.

 

print("arange:", np.arange(start=0, stop=5.7, step=0.8))
print("linspace:", np.linspace(start=0, stop=5.6, num=8))
결과:
arange: [0.  0.8 1.6 2.4 3.2 4.  4.8 5.6]
linspace: [0.  0.8 1.6 2.4 3.2 4.  4.8 5.6]

arange()와 linspace()의 결과를 같게 만들려면 위처럼 stop 값이나 num 값을 잘 따져 맞춰줘야 한다. 따라서 상황에 맞게 골라 쓰는 게 답(이지만 통상 개념이 익숙한 한 가지를 주로 쓰게 된다. 실수 방지 면에선 그게 나을 수도.)

 

print("arange:", np.arange(start=6, stop=0, step=-1))
print("linspace:", np.linspace(start=6, stop=0, num=7))
결과:
arange: [6 5 4 3 2 1]
linspace: [6. 5. 4. 3. 2. 1. 0.]

arange()의 step을 음수로 하거나, linspace()의 start/stop를 뒤집어 입력하면 감소 방향으로 배열이 생성된다.

 

print("arange:", np.arange(start=1, stop=3.0, step=1)) # start, stop, step 모두 정수여야 결과도 정수
→ arange: [1. 2.]
print("arange:", np.arange(start=1, stop=2, step=0.1))
arange: [1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9]
print("arange:", np.arange(start=1, stop=2, step=1)) # 정수로 stop을 포함하지 않아서 1개 원소만 생성되었다.
arange: [1]
print("arange:", np.arange(start=1, stop=1, step=1)) # 종료 조건 stop은 시작 조건 start보다 강력하다.
arange: []
print("arange:", np.arange(start=1, stop=1, step=0)) # 구간 길이 0, 분할길이 0이므로 산술연산 에러
ZeroDivisionError: division by zero

 

'Work' 카테고리의 다른 글

Definitions of Defect, Error, Failure, Fault and Problem  (0) 2020.06.30
BMS Software Engineer Test  (0) 2020.06.11
Second-life Battery  (0) 2020.04.23
모르고 배운 자의 최후  (0) 2020.03.06
목표 요건  (0) 2020.02.21