Python 2차원 array 다루기 예제(리스트 vs np.array)
파이썬에서 행렬 형태의 2차원 배열을 선언해보고 값을 추출/변경하며
내부 배열을 기준으로 정렬하는 방법들에 대해서 리스트를 활용한 방법과
Numpy array를 활용한 경우로 나누어 다루어보도록 하겠습니다.
1. 리스트를 활용한 2차원 배열(이중 리스트)
2차원 리스트 배열 선언
리스트에서는 2차원 배열을 선언할 때, 이중 for문을 사용하는 것이 가장 편리합니다.
바깥 for문에서 내부 배열의 리스트를 추가해주고 안쪽 for문에서는 각 내부 배열에
새로운 값을 추가해주는 방식입니다.
참고로, 각 내부 배열의 원소 개수가 모두 같지 않아도 됩니다.
모든 원소가 0인 4 * 3 크기의 배열 선언 예시는 아래와 같습니다.
arr = []
for i in range(4):
arr.append([]) # 새로운 내부 배열 선언
for j in range(3):
arr[i].append(0) # 해당 내부 배열에 0이라는 값 추가
print(arr) # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
2차원 리스트 배열 값 추출/변경
이중 리스트도 일반 리스트와 마찬가지의 인덱싱으로 값을 추출하고 변경할 수 있습니다.
인덱스 번호는 0번 부터 시작함에 유의하며, arr[i][j]로 (i, j)의 좌표에 해당하는
값을 추출할 수 있고, 해당 값을 새롭게 선언하면 그 위치의 값을 바꿀 수 있습니다.
# (0, 1) 위치의 값 변경
arr[0][1] = 2
print(arr) # [[0, 2, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
# (0, 1) 위치의 값 추출
print(arr[0][1]) # 2
이중 리스트에서 슬라이싱을 활용한 값 추출/변경도 일부는 가능합니다.
다만, arr[0:2][1:3]과 같은 사각형 모양 다중 슬라이싱은 여기서는 지원하지 않습니다.
리스트 형식 2차원 배열에서 가능한 값 추출/수정 방식을 정리한 코드는 아래와 같습니다.
# 초기 arr 상태 가정
print(arr) # [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
### 가능한 추출, 수정 방식 정리 ###
# 슬라이싱 내부 배열 추출
arr[0:2] # [[1, 2, 3, 4], [5, 6, 7, 8]]
# 내부 배열 인덱싱 뒤 슬라이싱
arr[1][0:2] # [5, 6]
# 내부 배열 통째로 값 변경
arr[0:2] = [[0, 0], [0, 1]]
print(arr) # [[0, 0], [0, 1], [9, 10, 11, 12], [13, 14, 15, 16]]
# 내부 배열 내 일부분 값 변경
arr[3][0:2] = [99, 99]
print(arr) # [[0, 0], [0, 1], [9, 10, 11, 12], [99, 99, 15, 16]]
2차원 리스트 배열 정렬
이중 리스트를 정렬하는 방법은 sort나 sorted 함수를 사용하면 편리합니다.
여기서는 sorted 함수를 통하여 내부 리스트 안에서의 정렬과 리스트 간 정렬의
예시 코드를 보여드리겠습니다.(첫 번째 값부터 비교하며 오름차순 정렬입니다.)
# 초기 arr 상태 가정
print(arr) # arr = [[1, 2, 4], [1, 3, 2], [4, 0, 5], [4, 2, 0]]
# 내부 리스트 안에서 정렬
for i in range(len(arr)):
arr[i] = sorted(arr[i])
print(arr) # [[1, 2, 4], [1, 2, 3], [0, 4, 5], [0, 2, 4]]
# 리스트 간 정렬
arr = sorted(arr)
print(arr) # [[0, 2, 4], [0, 4, 5], [1, 2, 3], [1, 2, 4]]
2. Numpy array를 활용한 2차원 배열
2차원 넘파이 배열 선언
이중 리스트를 가지고 2차원 넘파이 배열 변환도 가능하며,
np.zeors나 다른 넘파이 메소드를 활용하여 손쉽게 2차원 배열을 만들 수 있습니다.
아래는 대표적인 몇 가지 2차원 np.array 선언 예시입니다.
다만, 이 경우는 내부 배열 간 원소의 개수들은 모두 같은 것이 원칙입니다.
import numpy as np
arr1 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) # 2차원 리스트를 통한 선언
print(arr1)
'''[[1 2 3 4],
[5 6 7 8]]'''
arr2 = np.zeros((3, 4)) # np.zeros를 통한 3 * 4 크기 배열 선언
print(arr2)
'''[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]'''
arr3 = np.arange(1, 17).reshape(4, -1) # 1~16까지 숫자 순서대로의 4 * 4 크기 배열 선언
print(arr3)
'''[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]'''
2차원 넘파이 배열 값 추출/변경
기본적으로 이중 리스트에서 지원하는 값 추출/변경 방식은 여기서도 가능하며,
arr[i][j] 형식 대신 arr[i, j] 같은 식의 인덱싱도 가능하며, 이 방법을 사용하면
arr[0:2, 1:3]과 같은 이중 슬라이싱도 가능합니다.
몇 가지 가능한 넘파이 2차원 배열의 값 추출/변경의 예시 코드는 다음과 같습니다.
arr = np.arange(1, 17).reshape(4, -1) # 1 ~ 16까지 숫자 순서대로의 4 * 4 크기 배열 선언
print(arr)
'''[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]'''
# 값 추출 방법 예시
arr[1][2] # 7
arr[1, 2] # 7
arr[0:2, 1:3]
'''[[2 3]
[6 7]]'''
arr[:, 2] # [ 3 7 11 15]
# 값 변경 방법 예시
arr[1, 2] = 99
print(arr)
'''[[ 1 2 3 4]
[ 5 6 99 8]
[ 9 10 11 12]
[13 14 15 16]]'''
arr[:, -1] = np.array([100, 200, 300, 400])
print(arr)
'''[[ 1 2 3 100]
[ 5 6 99 200]
[ 9 10 11 300]
[ 13 14 15 400]]'''
arr[0:2, 0:2] = np.array([[-100, -100], [-200, -200]])
print(arr)
'''[[-100 -100 3 100]
[-200 -200 99 200]
[ 9 10 11 300]
[ 13 14 15 400]]'''
2차원 넘파이 배열 정렬
넘파이 배열에서 내부 배열 간 정렬을 할때는 마찬가지로 sorted 함수를 응용하면 되며,
내부 배열 안에서의 정렬을 진행할 때는 np.sort 함수에서 axis = 1로 지정하면 됩니다.
또한, np.sort 함수에서 axis = 0으로 변경하여 내부 배열 경계를 넘나드는
축 기준 정렬도 가능하니 참고해보세요.
각 경우의 정렬 코드와 결과 예시는 아래와 같습니다.
arr = np.array([[1, 2, 4], [1, 3, 2], [0, 5, 4], [4, 2, 0]])
print(arr)
'''[[1 2 4]
[1 3 2]
[0 5 4]
[4 2 0]]'''
# 배열 간 정렬
print(np.array(sorted(arr, key = lambda x : x[0])))
'''[[0 5 4]
[1 2 4]
[1 3 2]
[4 2 0]]'''
# 내부 배열 내에서 정렬
print(np.sort(arr, axis = 1))
'''[[1 2 4]
[1 2 3]
[0 4 5]
[0 2 4]]'''
# 내부 배열 경계를 넘나드는 축 기준 정렬(axis = 0 기준)
print(np.sort(arr, axis = 0))
'''[[0 2 0]
[1 2 2]
[1 3 4]
[4 5 4]]'''
'Python > 파이썬 기초' 카테고리의 다른 글
파이썬 로또 번호 추출, 당첨 등수 구하기 및 구매 시뮬레이션 구현 예제 (0) | 2022.07.07 |
---|---|
파이썬 소요 시간 측정 방법 : time.time() 활용과 %timeit (0) | 2022.05.16 |
파이썬 lambda 이용 함수 선언 예제 : 인자/return 값 여러개, 기본 값 지정, if문 활용 등 (0) | 2022.05.16 |