균일한 간격의 숫자 배열을 만드는 방법

이 학습 가이드에서는 Python 프로그래밍 환경에서 NumPy 라이브러리의 linspace() 함수를 활용하여 균등하게 분포된 숫자 배열을 생성하는 방법을 상세히 설명합니다.

NumPy linspace() 함수의 정확한 문법을 살펴보고, 다양한 예시를 통해 그 사용법을 익힐 수 있도록 구성했습니다.

주의: 본 튜토리얼을 원활하게 진행하려면, Python과 NumPy가 여러분의 시스템에 설치되어 있어야 합니다.

혹시 NumPy가 아직 설치되어 있지 않다면, 간편한 설치 안내를 참조해 주세요.

그럼, 시작해 볼까요?

NumPy 설치 및 임포트

본격적인 튜토리얼 시작에 앞서, NumPy 라이브러리를 설치하는 과정을 간단히 살펴보겠습니다.

⏩ NumPy가 이미 설치되어 있다면, 이 섹션은 건너뛰고 다음 단계로 바로 이동하셔도 좋습니다.

  • 클라우드 기반 Jupyter 노트북 환경인 Google Colab을 활용하는 경우, NumPy를 즉시 불러와 코딩을 시작할 수 있습니다. (본 튜토리얼에서는 이 방법을 권장합니다 ✅)
  • 로컬 환경에서 작업하는 것을 선호하신다면, Python의 Anaconda 배포판을 설치하는 것을 추천합니다. Anaconda는 여러 유용한 패키지들을 미리 갖추고 있습니다. 여러분의 운영 체제에 맞는 설치 프로그램을 다운로드하여 설치하세요. 설치 과정은 몇 분밖에 걸리지 않습니다.⌛
  • 이미 Python이 설치되어 있는 경우에도 Anaconda 배포판을 추가로 설치할 수 있습니다. 패키지 관리자 conda 또는 pip를 사용하여 NumPy를 설치하고 관리할 수 있습니다. Anaconda 명령 프롬프트에서 다음 명령 중 하나를 실행하여 NumPy를 설치해 보세요.
    
    # conda를 사용하여 NumPy 설치
    conda install numpy
    
    # pip를 사용하여 NumPy 설치
    pip install numpy
    
  

다음으로, import numpy as np 명령어를 실행하여 NumPy를 np라는 별칭으로 불러옵니다. 이렇게 하면 NumPy 모듈의 기능을 사용할 때마다 전체 이름을 입력하는 대신 간결하게 np로 참조할 수 있어 편리합니다.

    import numpy as np
  

앞으로 np.함수이름 과 같은 방식으로 NumPy 라이브러리의 모든 함수를 점 표기법을 사용하여 호출할 것입니다.

균등 간격 숫자 배열이 필요한 이유

NumPy 배열을 다루다 보면, 때때로 특정 범위 내에서 균등한 간격으로 배치된 숫자들로 구성된 배열이 필요할 수 있습니다.

더 깊이 들어가기 전에, 이와 유사한 기능을 제공하는 np.arange() 함수를 간략히 비교해 보겠습니다.

NumPy linspace() vs NumPy arange()

NumPy를 이전에 사용해 보셨다면, np.arange() 함수를 사용하여 특정 범위 내의 숫자 배열을 생성한 경험이 있을 것입니다.

np.arange(시작, 끝, 간격)는 ‘시작’ 값부터 ‘끝’ 값 직전까지 ‘간격’ 크기만큼 증가하는 숫자 배열을 생성합니다. 만약 ‘간격’ 값을 생략하면 기본값으로 1이 사용됩니다.

하지만, ‘간격’ 값이 항상 명확하게 주어지는 것은 아닙니다. 왜 그런지 몇 가지 사례를 통해 알아봅시다.

예를 들어, 0과 1 사이에 균등하게 배치된 4개의 숫자가 필요한 경우, 간격이 0.25이어야 한다는 것을 알 수 있습니다. 하지만 np.arange() 함수를 사용하면 ‘끝’ 값인 1이 배열에 포함되지 않습니다. 따라서, 1을 포함시키기 위해 간격 크기를 조정해야 합니다.

다음 그림은 특정 범위 [a, b] 내에서 균등한 간격으로 나뉜 점들이 필요한 다양한 상황들을 보여줍니다.

균등한 간격으로 배치된 점들의 예시

첫 번째 예시인 [0, 1] 범위에서 4개의 균등 간격 점을 생성하는 것은 비교적 쉬웠습니다. 각 점 사이의 간격이 0.25여야 한다는 것을 쉽게 알 수 있습니다.

하지만, 1부터 33 사이의 범위에서 7개의 균등 간격 점을 생성해야 하는 조금 더 복잡한 상황을 가정해 봅시다. 이 경우, 점 사이의 간격 값을 바로 알기는 어려울 수 있습니다. 물론, 수동으로 간격 값을 계산할 수도 있지만, 조금 더 편리한 방법이 필요합니다.

바로 이럴 때, np.linspace() 함수가 등장합니다! 😄

np.linspace() 함수를 사용할 때는 간격 크기에 대해 걱정할 필요 없이, 단지 필요한 점의 개수만 지정하면 됩니다. 원하는 대로 정확하게 배열을 얻을 수 있습니다.

이제 이러한 동기를 바탕으로, 다음 섹션에서 NumPy linspace() 함수의 문법을 자세히 알아보겠습니다.

NumPy linspace() 문법

NumPy linspace() 함수의 문법은 다음과 같습니다.

    np.linspace(start, stop, num, endpoint, retstep, dtype, axis)
  

처음에는 위 문법이 너무 많은 매개변수로 인해 복잡해 보일 수 있습니다.

하지만 대부분이 선택적인 매개변수이며, 조금만 더 자세히 살펴보면 훨씬 더 간단한 형태로 사용할 수 있다는 것을 알게 될 것입니다.

이제 위 문법을 하나씩 분석해 보겠습니다.

  • startstop은 각각 구간의 시작점과 끝점을 나타냅니다. startstop은 스칼라 값 또는 배열일 수 있습니다. 본 튜토리얼에서는 스칼라 시작 및 끝 값으로 제한하여 설명합니다.
  • num은 균등한 간격으로 배치할 점의 개수를 지정하는 매개변수입니다. 기본값은 50이며 선택적으로 지정할 수 있습니다.
  • endpoint는 True 또는 False 값을 가질 수 있는 선택적 매개변수입니다. 기본값은 True이며, 이는 구간의 끝점이 배열에 포함됨을 의미합니다. False로 설정하면 끝점이 배열에 포함되지 않습니다.
  • retstep은 또 다른 선택적 매개변수로, True 또는 False 값을 가질 수 있습니다. True로 설정하면 배열과 함께 간격 크기를 반환합니다.
  • dtype은 배열에 저장될 숫자의 데이터 유형을 지정하는 매개변수입니다. 일반적으로 float 형으로 자동 추론되므로 명시적으로 지정할 필요는 없습니다.
  • axis는 숫자 데이터가 저장되어야 하는 축을 나타내는 선택적 매개변수입니다. 이 매개변수는 startstop 값이 배열 자체인 경우에만 관련이 있습니다.

▶️ np.linspace()의 반환 값은 무엇일까요?

균등한 간격으로 배치된 숫자들로 구성된 N차원 배열을 반환합니다. retstep 매개변수가 True로 설정된 경우, 간격 크기도 함께 반환합니다.

지금까지의 내용을 바탕으로, np.linspace() 함수를 사용하는 가장 단순화된 문법은 다음과 같습니다.

    np.linspace(start, stop, num)
  

위 코드 한 줄은 [start, stop] 구간 내에서 균등한 간격으로 배치된 숫자 배열을 반환합니다.

이제 기본 문법을 익혔으니, 실제 예제 코딩을 시작해 보겠습니다.

NumPy linspace()로 균등 간격 배열 생성하기

#1. 첫 번째 예제에서는 [1, 5] 구간 내에서 균등하게 배치된 20개의 숫자로 구성된 배열을 생성해 보겠습니다.

start, stop, num 값을 키워드 인수로 지정할 수 있으며, 아래 코드 셀에 나타나 있습니다.

    
    import numpy as np
    arr1 = np.linspace(start = 1, stop = 5, num = 20)
    print(arr1)
    
    # 출력:
    [1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
     2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
     3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
     4.78947368 5.        ]
    
  

배열 내 숫자들이 1에서 시작하여 5에서 끝나며, 두 끝점이 모두 배열에 포함된다는 사실에 주목하십시오. 또한, 1과 5를 포함한 모든 숫자가 부동 소수점 형태로 표현된다는 점도 눈여겨보시기 바랍니다.

#2. 이전 예제에서는 start, stop, num에 대한 값을 키워드 인수로 전달했습니다. 올바른 순서로 인수를 전달하면 아래와 같이 값만 포함하는 위치 인수로 사용할 수도 있습니다.

    
    import numpy as np
    arr2 = np.linspace(1, 5, 20)
    print(arr2)
    
    # 출력:
    [1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
     2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
     3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
     4.78947368 5.        ]
    
  

#3. 이번에는 retstep을 True로 설정하여 다른 배열을 만들어 보겠습니다.

이렇게 하면 함수가 배열과 간격 크기를 모두 반환합니다. 따라서, 우리는 반환된 값을 두 개의 변수 (arr3: 배열, step_size: 간격 크기)로 언패킹할 수 있습니다.

다음 코드 셀은 이를 수행하는 방법을 보여줍니다.

    
    import numpy as np
    arr3, step_size = np.linspace(1, 5, 20, retstep=True)
    print(arr3)
    
    # 출력:
    [1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
     2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
     3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
     4.78947368 5.        ]

    # 출력:
    print(step_size)
    0.21052631578947367
    
    

#4. 마지막으로 endpoint를 False로 설정하고 어떤 일이 일어나는지 확인해 보겠습니다.

    
    import numpy as np
    arr4 = np.linspace(1, 5, 20, endpoint=False)
    print(arr4)
    
    # 출력:
    [1.  1.2 1.4 1.6 1.8 2.  2.2 2.4 2.6 2.8 3.  3.2 3.4 3.6 3.8
     4.  4.2 4.4 4.6 4.8]
    
    

반환된 배열에서 1은 포함되지만 5는 포함되지 않는 것을 확인할 수 있습니다. 배열의 마지막 값은 4.8이지만, 여전히 총 20개의 숫자를 포함하고 있습니다.

지금까지는 균등한 간격의 숫자 배열을 생성하는 방법을 살펴보았습니다. 다음 섹션에서는 이러한 숫자들을 시각적으로 표현하여 이해를 높여보도록 하겠습니다.

균등 간격 숫자를 그래프로 표현하는 방법

이 섹션에서는 [10, 15] 구간에 주목하여 살펴볼 것입니다. np.linspace() 함수를 사용하여 각각 8개 및 12개의 점을 가지는 두 개의 배열을 생성할 것입니다.

배열 생성을 완료한 후, matplotlib 라이브러리의 그래프 기능을 활용하여 이들을 시각화할 것입니다.

명확성을 위해, N1 = 8 및 N2 = 12인 두 배열을 y축을 따라 서로 다른 위치에 고정하여 균등 간격의 점들로 표현합니다.

다음 코드 조각은 이를 보여줍니다.

    
    import numpy as np
    import matplotlib.pyplot as plt
    
    N1 = 8
    N2 = 12
    
    a = 10
    b = 15
    
    y1 = np.zeros(N1)
    y2 = np.zeros(N2)
    
    x1 = np.linspace(a, b, N1)
    x2 = np.linspace(a, b, N2)
    
    plt.plot(x1, y1 - 0.5, 'o')
    plt.plot(x2, y2 + 0.5, 'o')
    
    plt.ylim([-1, 1])
    
    plt.title(f'[{a}, {b}] 구간 내 균등 간격 숫자')
    plt.xlabel('구간')
    
    plt.show()
    
    

균등 간격의 점들을 생성하는 것은 수학 함수를 다룰 때 매우 유용할 수 있습니다. 다음 섹션에서는 이러한 활용 사례를 자세히 살펴보겠습니다.

수학 함수와 NumPy linspace() 함께 사용하기

np.linspace() 함수를 사용하여 균등 간격의 숫자 배열을 생성한 후, 해당 구간에서 수학 함수의 값을 계산할 수 있습니다.

아래 코드 셀에서는 먼저 0에서 2π 사이의 구간에서 균등한 간격으로 50개의 점을 생성합니다. 그런 다음 np.sin() 함수를 사용하여 x 배열에 대한 사인 값을 계산하여 y 배열을 만듭니다. num 매개변수의 기본값이 50이므로 생략할 수도 있지만, 여기서는 명시적으로 사용합니다.

다음 단계에서는 [0, 2π] 구간에서 사인 함수를 그래프로 표현합니다. 이를 위해 이전 예제와 마찬가지로 matplotlib 라이브러리를 사용합니다. 특히, matplotlib.pyplotplot() 함수는 선 그래프를 생성하는 데 사용됩니다.

    
    import numpy as np
    import matplotlib.pyplot as plt
    
    N = 50
    
    a = 0.0
    b = 2 * np.pi
    
    x = np.linspace(a, b, N)
    y = np.sin(x)
    
    plt.plot(x, y, marker="o")
    
    plt.ylim([-1, 1])
    plt.title('y = sin(x)')
    plt.xlabel('x ---->')
    
    plt.show()
    
    

이제 위의 코드에서 N 값을 10으로 설정하여 다시 실행해 보겠습니다. 아래와 유사한 그래프를 얻을 수 있습니다.

그래프에서 보시다시피, 점을 10개만 선택했기 때문에 그래프가 그다지 매끄럽지 않습니다.

일반적으로 고려하는 점의 수가 많을수록 함수의 그래프는 더욱 부드러워집니다.

결론

지금까지 배운 내용을 요약하면 다음과 같습니다.

  • np.linspace(start, stop, num)[start, stop] 구간에서 균등한 간격으로 배치된 숫자 배열을 반환합니다.
  • 끝점을 제외하려면 선택적 매개변수 endpoint를 False로 설정하고, 구간을 [start, stop)으로 변경합니다.
  • 간격 크기를 얻으려면 선택적으로 retstep을 True로 설정합니다.
  • np.linspace() 함수를 사용하여 균등 간격의 배열을 생성한 다음, 수학 함수와 함께 해당 배열을 사용할 수 있습니다.

이제 np.linspace() 함수가 어떻게 작동하는지 충분히 이해하셨기를 바랍니다. Jupyter 노트북에서 위 예제를 직접 실행해 볼 수도 있습니다. Jupyter 노트북 또는 다른 Jupyter 대안에 대한 가이드를 참고해 보세요.

다음 Python 튜토리얼에서 다시 만나요. 그때까지 코딩을 즐기세요! 😀