알고리즘

[파이썬] numpy

hminor 2024. 4. 5. 12:00
  • 알고리즘 문제를 풀다가 1차원 배열을
  • n길이의 2차원 배열로 만드는 문제가 있어 
  • 이전에 학습한 numpy를 활용한 reshape()을 사용해서 해결했는데
  • 여기서 다른 해결 코드를 확인하다가 reshape() 인자값으로 -1을 넣은 것을 확인하여
  • 어떤 의미인지 확인하다가 다른 메서드들에 대해 관심을 가지게 되어 다시 포스팅하기로 생각함... ㅎㅎ
  • 우선 reshape()의 인자값으로 -1을 넣는 건 자동으로 해당 크기에 맞게 맞춰줄 때 사용하는 것으로
  • 예를 들어 크기가 12인 배열을 2행 6열로 할당하고자 할 경우 
  • n이 2로 입력이 주어진다면 간단하게 아래와 같이 작성하면 됨.
  • 여기서 tolist()를 하는 이유는
  • tolist()를 사용하기 이전에는 Numpy 배열이기에 배열로 출력하고자 한다면
  • tolist()를 사용하여 변환시켜주기!

 

import numpy as np
li = [1,2,3,4,5,6,7,8,9,10,11,12]
n = 2
arr = np.array(li).reshape(2,-1).tolist() # [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]

 


 

  • 그리고 Numpy는 이전 포스팅처럼 성능면에서 C로 구현되어 있기에
  • 연산이 벡터화되어 있어 반복문을 사용하지 않고 한 번에 많은 데이터를 처리할 수 있는 장점으로 
  • 자주 사용될 것 같아 좀 더 배열에 관해 공부하고 싶어졌슴.
  • 그래서 간단하게 배열의 추가, 변경, 삭제 그리고 정렬까지 공부하기로 함.
  • 우선 기존 배열에 값 추가
    • 흠 우선 기존 배열에 값을 추가하는 방식은 안된다.
    • 이유는 numpy 배열은 일반적으로 고정된 크기를 가지기에 새로운 요소를 추가, 제거는 쉽지가 않다.
    • 그래서 새로운 배열을 생성하고, 기존 배열 값을 복사해서 요소를 추가, 제거를 하는게 가능하다.
    • 방법은 아래와 같다.
    • import numpy as np
      
      values = [1, 2, 3, 4]
      arr = np.array(values)
      
      # 요소 추가
      new_arr_with_append = np.append(arr, 5)
      print("배열에 5 추가:", new_arr_with_append.tolist()) 
      # 배열에 5 추가: [1, 2, 3, 4, 5]
      
      # 여러 요소 추가
      new_arr_with_extend = np.append(arr, [6, 7])
      print("배열에 여러 요소 추가:", new_arr_with_extend.tolist()) 
      # 배열에 여러 요소 추가: [1, 2, 3, 4, 6, 7]
  • 그리고 기존 배열 값 변경
    • 기존 배열 값 변경의 경우엔 간단하게 기존 배열 변경 방법과 같다.
    • import numpy as np
      
      values = [1, 2, 3, 4]
      arr = np.array(values)
      
      # 인덱스 2의 값을 99로 변경
      arr[2] = 99
      print("인덱스 2의 값을 99로 변경:", arr.tolist())
      # [1, 2, 99, 4]
  • 기존 값 제거
    • 기존 값 제거 또한 추가와 마찬가지로 새로운 배열을 만드는 것으로 아래와 같이 하면 된다.
    • import numpy as np
      
      values = [1, 2, 3, 4]
      arr = np.array(values)
      
      # 인덱스 2의 요소 제거
      new_arr_with_delete = np.delete(arr, 2).tolist()
      print("인덱스 2의 요소 제거:", new_arr_with_delete)
      # [1,2,4]
      
      # 여러 인덱스의 요소 제거
      indices_to_remove = [1, 3]
      new_arr_without_indices = np.delete(arr, indices_to_remove).tolist()
      print("인덱스 1과 3의 요소 제거:", new_arr_without_indices)
      # [1,3]
  • 마지막으로 정렬
    • 기본적인 정렬 방법은 argsort() 메서드로 할 수 있다.
    • 다만 axis, kind, order와 같은 속성이 있기에 의도한 대로 잘 적용만 시킨다면 
    • 더 좋은 활용법이 될 것 같아 정리 함.
    • axis
      • 축 지정으로 다차원 배열을 정렬할 때, 어떤 축을 기준으로 정렬할 것인지 지정.
      • 예를 들어 2차원 배열에서 axis=1은 행, axis=0은 열
      • 쉽게 생각하면 css의 direction 방향을 기준으로 align-item을 생각하면 쉬울 듯?
      • import numpy as np
        
        arr = np.array([[3, 2, 1], [6, 5, 4]])
        
        # 행(axis=1)을 기준으로 정렬
        sorted_axis1 = np.argsort(arr, axis=1)
        print(sorted_axis1.tolist())
        # [[2, 1, 0], [2, 1, 0]]
        
        # 열(axis=0)을 기준으로 정렬
        sorted_axis0 = np.argsort(arr, axis=0)
        print(sorted_axis0.tolist())
        # [[0, 0, 0], [1, 1, 1]]
    • kind
      • 정렬 알고리즘 종류를 정하는 것으로 아래와 같이 총 3가지가 있다.
      • "quicksort": 퀵소트 알고리즘을 사용하여 정렬. (기본값)
        "mergesort": 병합정렬 알고리즘을 사용하여 정렬.
        "heapsort": 힙정렬 알고리즘을 사용하여 정렬.
    • order
      • 구조화된 배열의 경우 필드를 기준으로 정렬하는 것으로
      • array를 사용시 배열과 함께 dtype에 컬럼 타입을 지정하여 해당 타입에 따른 정렬이 가능하다.
      • import numpy as np
        
        # 구조화된 배열을 생성
        dtype = [('name', 'S10'), ('age', int), ('height', float)]
        values = [('Alice', 25, 5.6), ('Bob', 30, 6.0), ('Eve', 20, 5.7)]
        
        arr = np.array(values, dtype=dtype)
        print(arr.tolist())
        # [(b'Alice', 25, 5.6), (b'Bob', 30, 6.0), (b'Eve', 20, 5.7)]
        
        # 'age' 필드를 기준으로 정렬
        sorted_by_age = np.argsort(arr, order='age').tolist()
        print(sorted_by_age)
        # [2, 0, 1]
        
        # 'height' 필드를 기준으로 정렬
        sorted_by_height = np.argsort(arr, order='height').tolist()
        print("Sorted by height:")
        print(sorted_by_height)
        # [0, 2, 1]
      • 또한 위 코드의 dtype에 대해 설명하자면
      • name의 S10은 길이가 10인 문자열을 의미하며
      • 나머지 age는 정수, height는 부동소수를 의미

 

'알고리즘' 카테고리의 다른 글

[백준, 파이썬, 1406번] 에디터  (0) 2024.04.23
[백준, 파이썬, 10867번] 중복 빼고 정렬하기  (0) 2024.04.23
벡터 vector  (0) 2024.04.04
[파이썬] math, numpy  (0) 2024.04.04
[파이썬] 순열,조합  (0) 2024.04.04