- 알고리즘 문제를 풀다가 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 |