콘텐츠로 건너뛰기

파이썬 numpy 사용 방법, 행렬 계산에 최고인듯

    들어가며

    numpy는 파이썬에서 다차원 배열을 처리하고 다양한 수학적 연산을 수행하는 데 사용하는 핵심 라이브러리입니다. numpy는 배열 객체를 제공하며, 이를 통해 효율적이고 빠른 계산을 가능하게 하는데요. 이 글에서는 numpy를 설치하고 사용하는 방법, 기본적인 배열 연산, 그리고 좀 더 효율적인 사용을 위한 고급 기능들까지 numpy를 사용하는 기본기들을 소개하겠습니다.

    왜 numpy를 사용하나요?

    성능 및 효율성

    1. 고성능 연산: numpy는 배열 연산을 최적화하여 빠른 속도로 수행할 수 있도록 설계되었습니다. 이는 대규모 데이터 처리를 할 때 유리합니다.
    2. 메모리 효율성: numpy 배열은 일반적인 파이썬 리스트와 달리 고정된 타입의 데이터를 사용합니다. 이로인해 메모리를 덜 사용합니다.

    다양한 기능 제공

    1. 다차원 배열: numpy는 1차원 배열부터 N차원 배열까지 다양한 형태의 배열을 쉽게 다룰 수 있습니다.
    2. 수학적 연산: numpy는 벡터와 행렬 연산을 포함한 다양한 수학적 연산을 지원합니다.
    3. 데이터 분석: pandas와 함께 사용하여 데이터 분석 작업을 더 효율적으로 수행할 수 있습니다.

    사용 용이성

    1. 간결한 문법: numpy는 간단한 문법으로 복잡한 배열 연산을 수행할 수 있게 해줍니다.
    2. 호환성: 다양한 데이터 형식을 지원하며, 다른 데이터 분석 라이브러리와 잘 통합됩니다.

    numpy 설치

    먼저, numpy가 설치되어 있지 않다면 설치해야 합니다. pip를 사용하여 간단히 설치할 수 있습니다.

    pip install numpy

    numpy 기본 사용법

    numpy 임포트

    numpy를 사용하기 위해서는 먼저 임포트해야 합니다. 관습적으로 numpy는 np로 줄여서 사용하는데요. 모두가 그렇게 사용하니 여러분도 참여하시는게 여러모로 편리할거에요.

    import numpy as np

    배열 생성

    numpy 배열은 array 함수를 사용하여 생성할 수 있습니다. 아래 코드들을 참고해 보세요 1차원, 2차원, N차원 배열을 쉽게 만들 수 있습니다.

    1차원 배열 생성

    array_1d = np.array([1, 2, 3, 4, 5])
    print(array_1d) # [1 2 3 4 5]

    2차원 배열 생성

    array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(array_2d)
    # [[1 2 3]
    #  [4 5 6]
    #  [7 8 9]]

    N차원 배열 생성

    array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
    print(array_3d)
    
    # [[[1 2]
    #   [3 4]]
    #
    #  [[5 6]
    #   [7 8]]]

    배열의 속성

    numpy 배열은 다양한 속성을 가지고 있는데요. 아래와 같은 방법으로 배열의 차원, 형태, 크기 등을 확인할 수 있습니다.

    print(array_2d.ndim)   # 2 (차원 수)
    print(array_2d.shape)  # (3, 3) (형태: 행, 열)
    print(array_2d.size)   # 9 (요소의 총 개수)
    print(array_2d.dtype)  # int64 (데이터 타입)

    배열 연산

    numpy를 사용하면 배열 간의 다양한 수학적 연산을 간단히 수행할 수 있습니다.

    기본 연산

    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    
    print(a + b)  # [5, 7, 9]
    print(a - b)  # [-3, -3, -3]
    print(a * b)  # [4, 10, 18]
    print(a / b)  # [0.25, 0.4, 0.5]

    행렬 연산

    이 글의 목적이라고 해야할까요? numpy 라이브러리를 사용하면 여러 종류의 행렬 연산을 간단하게 수행할 수 있습니다. 다음은 numpy를 사용하여 행렬 연산을 수행하는 여러 가지 방법들입니다:

    1. 행렬 곱셈 (Matrix Multiplication)

    행렬 곱셈은 np.dot 또는 @ 연산자를 사용하여 수행할 수 있습니다.

    import numpy as np
    
    matrix1 = np.array([[1, 2], [3, 4]])
    matrix2 = np.array([[5, 6], [7, 8]])
    
    # np.dot을 사용한 행렬 곱셈
    result = np.dot(matrix1, matrix2)
    print(result)
    # [[19 22]
    #  [43 50]]
    
    # @ 연산자를 사용한 행렬 곱셈
    result = matrix1 @ matrix2
    print(result)
    # [[19 22]
    #  [43 50]]
    2. 원소별 곱셈 (Element-wise Multiplication)

    원소별 곱셈은 * 연산자를 사용하여 수행할 수 있습니다.

    elementwise_product = matrix1 * matrix2
    print(elementwise_product)
    # [[ 5 12]
    #  [21 32]]
    3. 전치 행렬 (Transpose)

    전치 행렬은 np.transpose 함수 또는 .T 속성을 사용하여 수행할 수 있습니다.

    transpose = np.transpose(matrix1)
    print(transpose)
    # [[1 3]
    #  [2 4]]
    
    transpose = matrix1.T
    print(transpose)
    # [[1 3]
    #  [2 4]]
    4. 행렬 역행렬 (Inverse)

    행렬의 역행렬은 np.linalg.inv 함수를 사용하여 계산할 수 있습니다.

    inverse = np.linalg.inv(matrix1)
    print(inverse)
    # [[-2.   1. ]
    #  [ 1.5 -0.5]]
    5. 행렬 행렬식 (Determinant)

    행렬식은 np.linalg.det 함수를 사용하여 계산할 수 있습니다.

    determinant = np.linalg.det(matrix1)
    print(determinant)
    # -2.0000000000000004
    6. 고유값과 고유벡터 (Eigenvalues and Eigenvectors)

    고유값과 고유벡터는 np.linalg.eig 함수를 사용하여 계산할 수 있습니다.

    eigenvalues, eigenvectors = np.linalg.eig(matrix1)
    print(eigenvalues)
    # [-0.37228132  5.37228132]
    print(eigenvectors)
    # [[-0.82456484 -0.41597356]
    #  [ 0.56576746 -0.90937671]]
    7. 특이값 분해 (Singular Value Decomposition)

    특이값 분해는 np.linalg.svd 함수를 사용하여 수행할 수 있습니다.

    U, S, V = np.linalg.svd(matrix1)
    print(U)
    # [[-0.40455358 -0.9145143 ]
    #  [-0.9145143   0.40455358]]
    print(S)
    # [5.4649857  0.36596619]
    print(V)
    # [[-0.57604844 -0.81741556]
    #  [ 0.81741556 -0.57604844]]

    이처럼 numpy를 사용하면 다양한 행렬 연산을 간단하게 수행할 수 있습니다.

    브로드캐스팅

    numpy는 서로 다른 형태의 배열 간의 연산을 지원하는 브로드캐스팅 기능도 있습니다.

    a = np.array([1, 2, 3])
    b = np.array([[1], [2], [3]])
    
    print(a + b)
    # [[2 3 4]
    #  [3 4 5]
    #  [4 5 6]]

    유용한 함수들

    numpy는 배열 생성과 조작을 자주 하시는 분들이라면 아래 함수들을 알고 계시는것도 좋을것 같습니다. 배열 생성과 조작을 위한 유용한 함수들이에요.

    배열 초기화

    zeros = np.zeros((2, 3))       # 모든 요소가 0인 배열
    # [[0. 0. 0.]
    #  [0. 0. 0.]]
    ones = np.ones((2, 3))         # 모든 요소가 1인 배열
    # [[1. 1. 1.]
    #  [1. 1. 1.]]
    identity = np.eye(3)           # 단위 행렬
    # [[1. 0. 0.]
    #  [0. 1. 0.]
    #  [0. 0. 1.]]
    arange = np.arange(0, 10, 2)   # 0부터 10까지 2씩 증가하는 배열
    # [0 2 4 6 8]
    linspace = np.linspace(0, 1, 5)  # 0부터 1까지 5등분한 배열
    # [0.   0.25 0.5  0.75 1.  ]

    배열 변형

    array = np.array([[1, 2, 3], [4, 5, 6]])
    reshaped = array.reshape((3, 2))  # 배열 형태 변경
    print(reshaped)
    # [[1 2]
    #  [3 4]
    #  [5 6]]
    
    flattened = array.flatten()       # 1차원 배열로 변환
    print(flattened)  # [1 2 3 4 5 6]

    아래 고급 기능들도 한번 보고가시죠

    슬라이싱 및 인덱싱

    numpy 배열은 리스트와 유사한 방식으로 슬라이싱 및 인덱싱이 가능합니다.

    array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    
    print(array[0, 1])    # 2 (특정 요소 접근)
    print(array[:, 1])    # [2 5 8] (특정 열 접근)
    print(array[1:3, :])  # [[4 5 6]
                          #  [7 8 9]] (부분 배열 접근)

    조건부 선택

    array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    print(array[array > 5])  # [6 7 8 9]

    통계 함수

    numpy는 다양한 통계 함수를 제공합니다.

    array = np.array([1, 2, 3, 4, 5])
    
    print(np.mean(array))   # 3.0 (평균)
    print(np.std(array))    # 1.4142135623730951 (표준편차)
    print(np.min(array))    # 1 (최소값)
    print(np.max(array))    # 5 (최대값)
    print(np.sum(array))    # 15 (합계)

    마무리

    numpy의 사용방법과 여러가지 기능들에 알아보았습니다. 일단 행렬 계산엔 아주아주 유용한 라이브러리인건 확실한 것 같습니다. 또 파이썬으로 다차원 배열만을 다룬다고 해도 꽤나 유용하게 사용할 수 있죠.

    오늘 글을 통해 제공한 정보들은 배열의 생성, 변형, 연산 등 다양한 기능을 제공하여 데이터 처리와 분석을 더 효율적으로 수행할 수 있도록 도와줄 것이라고 생각합니다. numpy에 대해 이해하셨나요? 이제 데이터 처리 효율이 상승하셨습니다!