본문 바로가기
python/문법

[python] [문법] 2차원 리스트 이걸로 끝

by 설화님 2024. 1. 27.

리스트를 사용 할 때 한 줄로 늘어진 1차원 리스트라면, 리스트 2개를 사용한다면 2차원 리스트가 된다.

 

쉽게 말하면 표의 행과 열의 구분이다.

 

a = [[10, 20],[30, 40],[50, 60]]

이는 3행 2열이다.

그래서 a의 길이는 3이다. 

 

 

 

이제 이를 for문을 통해 출력을 한다고 과정 했을 때

a = [[10, 20], [30, 40], [50, 60]]
print(a)
for i in a:
    for j in i:
        print(j)

2개의 리스트를 사용하기 때문에 2개의 for문이 필요하다.

 

 

그러나 파이썬을 사용하므로 간략하게 쓰는 방법도 있다.

a = [[10, 20], [30, 40], [50, 60]]
for x, y in a:
	print(x, y)

이렇게 for문 하나로도 이차원 배열 또한 출력이 가능하다.

 

이는 for문만 있지 않고 while에도 존재한다.

a = [[1, 2],[3,4],[5,6]]

i=0
while i <len(a):
    x,y = a[i]
    print(x,y)
    i+=1

while의 특성상 초기문과 증감문이 별도로 있어서 길어지긴 했지만 while또한 하나의 반복문으로

이차원 배열을 출력이 가능하다.

 

 

for문을 이용해서 비어있는 2차원 리스트를 만들어 보자.

a = []

for i in range(3):
    line = []
    for j in range(2):
        line.append(0)
    a.append(line)
print(a)

>>>[[0,0],[0,0],[0,0]]

 

값이 들어 있는 리스트가 아니라 값이 비어있는 리스트가 생성되었다.  append를 통해 값을 추가하고

1차원 for문의 append를 통해 값을 담은 리스트를 추가해서 만드는 방식이다.

a의 입장에서는 [리스트, 리스트, 리스트] 이기 때문이다.

 

 

리스트 표현식으로 2차원 리스트 만들기

a = [[0 for j in range(2)] for i in range(3)]

>>>[[0,0],[0,0],[0,0]]

 

위의 리스트가 길게 느껴진다면 한 줄로도 설명이 가능하다. 이제 이는 파이썬에 능숙해졌다면 사용할 수 있는 기술이다.

 

 

이제 이를 응용한다면.

a = [[0]* i for i in [3, 1, 3, 2, 5]]

>>>[[0,0,0,] , [0], [0,0,0], [0,0], [0,0,0,0,0]]

 

가로의 길이(열)을 알고 있다는 가정에 한에서 그에 맞게 행의 열이 결정되는 리스트다.

이처럼 파이썬을 응용할 수 있다면 코딩의 줄 길이가 점차 짧아짐을 느낄 수가 있다.

 

 

이차원 리스트를 복사하기

a = [[10, 20], [30, 40]]
import copy
b = copy.deepcopy(a)

그냥 copy를 사용 할 경우 앞서 배운 것 처럼 a의 리스트를 copy를 할 수 있다.

그러나 a값 안에 또 다른 리스트는 copy 대상에 되지 않고.

만약 하지 않을 경우, b의 값을 변경해도 a의 값이 변경되는 상황이 발생한다.

 

그래서 1차원이 아닌, 다중 배열을 사용하게 될 경우에는 copy.deepcopy를 사용해야한다

 

2차원 배열(리스트)를 선언하고 초기화하는 방법을 소개합니다.

1. 2차원 배열 선언 방법

2차원 리스트는 아래와 같이 선언할 수 있습니다.

[[a1,a2,a3,...,an],[b1,b2,b3,...,bn]]

예를 들어, 3열 2행으로 구성된 2차 배열은 아래와 같이 선언하고 내용을 출력할 수 있습니다.

arr = [[1, 2, 3], [4, 5, 6]]

print(arr)

Output:

[[1, 2, 3], [4, 5, 6]]

위의 2차배열을 그림으로 표현하면 다음과 같습니다.

2. List comprehension으로 2차 배열 선언

위에서 소개한 방법으로 큰 사이즈의 배열을 미리 선언하려면 매우 힘듭니다.

아래와 같이 List comprehension을 이용하면 원하는 크기의 배열을 생성할 수 있습니다. 배열의 초기 값은 0으로 설정하였습니다.

rows = 3
cols = 4

arr = [[0 for j in range(cols)] for i in range(rows)]

print(arr)

Output:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

만약 배열을 생성하면서 초기화도 함께 하려면 아래와 같이 List comprehension에 특정 값으로 설정되도록 만들면 됩니다. (i + 1)*(j + 1)가 초기 값이 되는 코드입니다.

rows = 3
cols = 4

arr = [[(i + 1)*(j + 1) for j in range(cols)] for i in range(rows)]

print(arr)

Output:

[[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12]]

3. 2차원 배열 행(row) 추가

자료구조는 리스트이기 때문에, append()와 insert()로 행을 추가할 수 있습니다. append()는 리스트 마지막에 추가되고, insert()은 첫번째 인자로 추가하려는 행의 위치를 선택할 수 있습니다.

arr = [[1, 2, 3, 4], [5, 6, 7, 8]]

arr.append([9, 10, 11, 12])
print(arr)

arr.insert(0, [0, 0, 0, 0])
print(arr)

Output:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[[0, 0, 0, 0], [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

4. 2차원 배열의 행, 열의 값 변경

행과 열의 값을 변경할 수 있습니다. arr[index] = 처럼 행 전체를 변경할 수 있고, arr[i][j] = 처럼 요소 1개의 값만 변경할 수도 있습니다.

arr = [[1, 2, 3, 4], [5, 6, 7, 8]]

arr[0] = [9, 10, 11, 12]
print(arr)

arr[1][0] = 0
arr[1][3] = 0
print(arr)

Output:

[[9, 10, 11, 12], [5, 6, 7, 8]]
[[9, 10, 11, 12], [0, 6, 7, 0]]

4.1 for문으로 배열 전체 값 변경

아래와 같이 for문으로 모든 요소를 순회하면서 값을 변경할 수 있습니다.

arr = [[1, 2, 3, 4], [5, 6, 7, 8]]

for i in range(len(arr)):
    for j in range(len(arr[i])):
        arr[i][j] = (i + 1) * (j + 1)

print(arr)

Output:

[[1, 2, 3, 4], [2, 4, 6, 8]]

5. 2차원 배열 행(row) 삭제

del array[index]로 2차 배열에서 특정 Index의 행을 삭제할 수 있습니다.

arr = [[1, 2, 3, 4], [5, 6, 7, 8]]

del arr[0]

print(arr)

Output:

[[5, 6, 7, 8]]

6. 2차원 배열 길이

다음과 같이 행과 열의 길이를 계산할 수 있습니다. 열의 길이가 같다는 전제하에, 첫번째 row의 길이를 열의 길이로 계산하였습니다.

arr = [[1, 2, 3, 4], [5, 6, 7, 8]]

print(f"length of rows: {len(arr)}")
print(f"length of columns: {len(arr[0])}")

Output:

length of rows: 2
length of columns: 4
 

 

파이썬 Numpy Array Matrix에 행 값 리스트(List) 추가하기

 

넘파이로 배열(Matrix)을 만들고 추가 행을 붙이는 방법에 대해서 알아 보겠습니다. 행(Row)을 붙이는 함수는 아래와 같습니다.

 

np.r_(원본 어레이, 추가할 행)

 

함수는 r_ 함수를 사용하고 입력 값으로는 원본 array값에 추가할 행 값을 입력 합니다. 여기서 추가할 행에서 주의할 부분은 row의 개수에 맞춘 numpy array 값이여야 하고 list로 넣을 경우 [[ ]] 괄호를 두번 사용해서 동일 matrix라는 사실을 명기 해야 합니다

 

그렇지 않으면 아래와 같은 에러 메세지가 발생 합니다.

 

    row_add_list = np.r_[np_list, insert_row]
  File "C:\Users\forgo\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\lib\index_tricks.py", line 412, in __getitem__
    res = self.concatenate(tuple(objs), axis=axis)
  File "<__array_function__ internals>", line 180, in concatenate
ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 3 and the array at index 1 has size 2

 

    row_add_list = np.r_[np_list, insert_row]
  File "C:\Users\forgo\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\lib\index_tricks.py", line 412, in __getitem__
    res = self.concatenate(tuple(objs), axis=axis)
  File "<__array_function__ internals>", line 180, in concatenate
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)

 

 

예제를 코드를 보면 쉽게 이해할 수 있습니다.

 

 

예제 코드>>

import numpy as np;

np_list = np.array([[1, 2, 3], 
                     [4, 5, 6], 
                     [7, 8, 9], 
                     [10, 11, 12]])

insert_row = [["x", "y", "z"]]

row_add_list = np.r_[np_list, insert_row]

print("np_list : \n",np_list)
print("row_add_list : \n",row_add_list)

3~6번 라인: 3x4의 배열(Matrix)를 생성합니다.

8번 라인: 3x1ㅇ의 행 값을 리스트로 만듭니다.

10번 라인: r_함수를 사용해서 추가 합니다.

 

 

결과>>

np_list : 
 [[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
row_add_list :
 [['1' '2' '3']
 ['4' '5' '6']
 ['7' '8' '9']
 ['10' '11' '12']
 ['x' 'y' 'z']]

 

 

 

 

 

파이썬 Numpy Array Matrix에 열 값 리스트(List) 추가하기

 

앞서 행 추가와 유사합니다. 이번에는 c_ 함수를 사용해서 열(Column) 값을 추가 합니다.

 

np.c_(원본 넘파이 어레이, 추가할 열)

 

앞서 행을 추가할 때 주의점에 대해 설명 드렸습니다. 열을 추가할 경우 리스트 값을 사용하면 행과는 다르게 단순 리스트 (행렬(Matrix)로 정의 안해도 됨)로 사용하셔도 됩니다. 하지만 열(Column)의 개수는 맞춰줘야 합니다.

 

아래 예제를 확인하시면 쉽게 이해할 수 있습니다. 

 

 

예제 코드>>

import numpy as np;

np_list = np.array([[1, 2, 3], 
                     [4, 5, 6], 
                     [7, 8, 9], 
                     [10, 11, 12]])

insert_column = ["a", "b", "c", "d"]

col_add_list = np.c_[np_list, insert_column]

print("np_list : \n",np_list)
print("col_add_list : \n",col_add_list)

3~6번 라인: 3x4의 배열(Matrix)를 생성합니다.

8번 라인: 1x4의 열 값을 리스트로 만듭니다.

10번 라인: c_함수를 사용해서 추가 합니다.

 

 

 

결과>>

np_list : 
 [[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
col_add_list :
 [['1' '2' '3' 'a']
 ['4' '5' '6' 'b']
 ['7' '8' '9' 'c']
 ['10' '11' '12' 'd']]

출처: https://scribblinganything.tistory.com/485 [여행하는 코딩끄적끄적:티스토리]

 

 

https://076923.github.io/posts/Python-numpy-5/