파이썬과 컴퓨터 사이언스(데이터 구조) - 대표적인 데이터 구조1: 배열 (Array)

2. 대표적인 데이터 구조1: 배열 (Array)

  • 데이터를 나열하고, 각 데이터를 인덱스에 대응하도록 구성한 데이터 구조
    • 파이썬에서는 리스트 타입이 배열 기능을 제공함
In [ ]:
# 한 학급의 학생이 Dave, David

name1 = 'Dave'
name2 = 'David'

2.1. 파이썬 리스트 타입

In [7]:
# 1차원 배열: 리스트로 구현시
data_list = [1, 2, 3, 4, 5]
data_list
Out[7]:
[1, 2, 3, 4, 5]
In [14]:
# 2차원 배열: 리스트로 구현시
data_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
data_list
Out[14]:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [15]:
print (data_list[0])

print (data_list[0][0])
print (data_list[0][1])
print (data_list[0][2])
print (data_list[1][0])
print (data_list[1][1])
[1, 2, 3]
1
2
3
4
5


프로그래밍 연습
1. 위의 2차원 배열에서 9부터 1까지 거꾸로 한줄에 한 숫자씩 출력해보기
In [27]:
data_list[2][2]
Out[27]:
9
In [28]:
data_list[2][1]
Out[28]:
8
In [30]:
for index in range(2, -1, -1):
    print (index)
2
1
0
In [31]:
for index in range(2, -1, -1):
    print (data_list[2][index])
9
8
7
In [32]:
for index in range(2, -1, -1):
    for index2 in range(2, -1, -1):
        print (data_list[index][index2])
9
8
7
6
5
4
3
2
1

참고

  • range(stop): range(10)은 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • range(start, stop): range(1, 11)은 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  • range(start, stop, step): range(0, 20, 2)은 0, 2, 4, 6, 8, 10, 12, 14, 16, 18
    • start, stop, step은 음수로 지정 가능


In [33]:
dataset = ['Braund, Mr. Owen Harris',
'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
'Heikkinen, Miss. Laina',
'Futrelle, Mrs. Jacques Heath (Lily May Peel)',
'Allen, Mr. William Henry',
'Moran, Mr. James',
'McCarthy, Mr. Timothy J',
'Palsson, Master. Gosta Leonard',
'Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)',
'Nasser, Mrs. Nicholas (Adele Achem)',
'Sandstrom, Miss. Marguerite Rut',
'Bonnell, Miss. Elizabeth',
'Saundercock, Mr. William Henry',
'Andersson, Mr. Anders Johan',
'Vestrom, Miss. Hulda Amanda Adolfina',
'Hewlett, Mrs. (Mary D Kingcome) ',
'Rice, Master. Eugene',
'Williams, Mr. Charles Eugene',
'Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)',
'Masselmani, Mrs. Fatima',
'Fynney, Mr. Joseph J',
'Beesley, Mr. Lawrence',
'McGowan, Miss. Anna "Annie"',
'Sloper, Mr. William Thompson',
'Palsson, Miss. Torborg Danira',
'Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)',
'Emir, Mr. Farred Chehab',
'Fortune, Mr. Charles Alexander',
'Dwyer, Miss. Ellen "Nellie"',
'Todoroff, Mr. Lalio']
프로그래밍 연습
1. 위의 dataset 리스트에서 각 이름의 길이를 출력하세요
In [23]:
for data in dataset:
    print (len(data))
23
51
22
44
24
16
23
30
49
35
31
24
30
27
36
32
20
28
55
23
20
21
27
28
29
57
23
30
27
19
프로그래밍 연습
1. 위의 dataset 리스트에서 각 이름 맨 앞 문자가 T 인 이름만 출력하기
In [38]:
data = 'Dave'
if data[0] == 'D':
    print (data)
Dave
In [34]:
for data in dataset:
    if data[0] == 'T':
        print (data)
Todoroff, Mr. Lalio
프로그래밍 연습
1. 위의 dataset 리스트에서 각 이름 맨 앞 문자가 A 인 이름만 모아서 dataset_A 이름으로 별도 리스트 만들기


In [39]:
dataset_A = list()
In [40]:
data = 'Dave'
In [41]:
dataset_A.append(data)
In [42]:
dataset_A
Out[42]:
['Dave']
In [ ]:
 
In [35]:
dataset_A = list()
for data in dataset:
    if data[0] == 'A':
        dataset_A.append(data)
print (dataset_A)
['Allen, Mr. William Henry', 'Andersson, Mr. Anders Johan', 'Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)']
In [44]:
count = 0

for data in dataset:
    for index in range(len(data)):
        if data[index] == 'M':
            count += 1
print (count)
38


프로그래밍 연습
1. 위의 dataset 리스트에서 전체 이름 안에 M 은 몇 번 나왔는지 빈도수 출력하기
In [40]:
m_count = 0
for data in dataset:
    for index in range(len(data)):
        if data[index] == 'M':
            m_count += 1
print (m_count)
38

2.2. 파이썬 array 라이브러리 (참고)

  • C언어에서 제공하는 배열을 그대로 파이썬에서 활용할 수 있도록 만든 라이브러리
    • 메모리를 파이썬 리스트보다 적게 차지한다는 장점이 있음
    • 리스트를 주로 사용하고, 이런 라이브러리가 있음을 참고만 하는 것이 더 좋음
  • 데이터 타입을 정해줘야 하며(Type Code), 각 Type Code 의미는 다음과 같음
In [12]:
### array 라이브러리 활용 예1
from array import *

data_array = array('l', [1, 2, 3, 4, 5])
print (data_array[1])
2
In [15]:
### array 라이브러리 활용 예2
data_array = array('i', range(10))
print (data_array[0])
print (data_array[5])
0
5
In [20]:
### array 라이브러리 활용 예4 (읽고, 쓰고, 수정, 삭제하는 문법은 리스트와 동일)
data_array = array('i')
for num in range(1000):
    data_array.append(num)
print (data_array[10])
del data_array[10]
print (data_array[10])
10
11

2.3. numpy 라이브러리 (데이터 사이언스에서 주로 사용, 머신 러닝을 위한 행렬 계산!)

  • numpy는 과학 계산을 위한 라이브러리로, 데이터 사이언스에서 많이 사용됨
  • 다차원 배열로 표현되는 행렬 계산을 저수준 언어(C언어)로 구현해서, 속도가 빠름
  • 데이터 사이언스를 위해 필수적으로 알아둬야 하는 라이브러리 중 하나
  • 이 장에서는 맛보기로 numpy 배열 기능만 알아보기로 함


numpy array

  • array 라이브러리와 마찬가지로, 리스트와 달리, 동일한 타입의 데이터만 array로 저장
    • 차원의 수를 rank라고 함

생성 방법

  1. 파이썬 리스트를 사용하는 방법
  2. numpy 에서 제공하는 함수를 사용하는 방법

2.3.1. 파이썬 리스트를 사용하는 방법

In [31]:
# 1. 파이썬 리스트를 사용하는 방법1
import numpy as np      # <--- 보통 이와 같이 임포트를 많이 함

data_list = [1, 2, 3, 4, 5]
np_array = np.array(data_list)  # <--- 리스트로 생성하기 (1차원)

# 배열 읽기
print (np_array[0])   
print (np_array.shape)          # shape은 각 차원의 크기를 알려주는 메서드, 1차원에 5개 데이터
1
(5,)
In [8]:
# 1. 파이썬 리스트를 사용하는 방법2
import numpy as np      # <--- 보통 이와 같이 임포트를 많이 함

# 2X3 (2 rank(행), 3 shape(열)로 배열 생성하기)
np_array = np.array([[1, 2, 3], [4, 5, 6]])  # <--- 리스트로 생성하기

# 배열 읽기
print (np_array[0])
print (np_array[0, 1])
print (np_array[1, 1])
print (np_array.shape)          # 2차원, 1차원은 2개, 2차원은 3개 데이터
[1 2 3]
2
5
(2, 3)
In [10]:
np_array = np.array([[[ 0,  0,  0,  0],
                      [ 1,  2,  3,  4],
                      [ 2,  2,  2,  2]],

                     [[ 3,  3,  3,  3],
                      [ 4,  4,  4,  4],
                      [ 5,  5,  5,  5]]])
print (np_array[0])
print (np_array[0, 1])
print (np_array[0, 1, 1])
print (np_array.shape)          # 3차원, 1차원은 2개, 2차원은 3개 데이터, 3차원은 4개 데이터
[[0 0 0 0]
 [1 2 3 4]
 [2 2 2 2]]
[1 2 3 4]
2
(2, 3, 4)
In [49]:
print (np_array[1, 1, 1])
np_array[1, 1, 1] = 2        # <--- 데이터 수정
print (np_array[1, 1, 1])
0.0
2.0


초간단 연습
1. 3차원 배열로, 1차원은 3개, 2차원은 2개, 3차원은 1개로 만들어보기, 모든 값은 0
In [ ]:
import numpy as np
np_array = np.array([[[ 0 ],
                      [ 2 ]],

                     [[ 3 ],
                      [ 2 ]],
                     
                     [[ 3 ],
                      [ 2 ]]
                    ])
In [42]:
# 항상 헷깔리기 때문에...
np_array = np.array([
                     [[ 0 ],
                      [ 0 ]],

                     [[ 0 ],
                      [ 0 ]],
    
                     [[ 0 ],
                      [ 0 ]]
                    ])
print (np_array[0])
print (np_array.shape)
[[0]
 [0]]
(3, 2, 1)

2.3.2. numpy 에서 제공하는 함수를 사용하는 방법

  • zeros(): 모든 값을 0으로 하는 배열 만들기
  • ones(): 모든 값을 1으로 하는 배열 만들기
  • full(): 모든 값을 특정 값으로 하는 배열 만들기
  • eye(): 대각선으로는 1, 나머지는 0으로 하는 2차원 배열 만들기
In [53]:
# numpy 에서 제공하는 함수를 사용하는 방법1
import numpy as np

np_array = np.zeros((2, 2))  # <--- 입력은 각차원의 크기, shape 메서드의 결과값과 동일, 입력 타입이 튜플() 임을 확인!
print (np_array)

np_array = np.zeros((2, 3))
print (np_array)

np_array = np.zeros((3, 2, 1))
print (np_array)
[[ 0.  0.]
 [ 0.  0.]]
[[ 0.  0.  0.]
 [ 0.  0.  0.]]
[[[ 0.]
  [ 0.]]

 [[ 0.]
  [ 0.]]

 [[ 0.]
  [ 0.]]]
In [54]:
# numpy 에서 제공하는 함수를 사용하는 방법2
np_array = np.ones((2, 2))
print (np_array)
[[ 1.  1.]
 [ 1.  1.]]
In [55]:
# numpy 에서 제공하는 함수를 사용하는 방법3
np_array = np.full((2, 3), 5)   # <--- 입력은 각차원의 크기, shape 메서드의 결과값과 동일, 입력 타입이 튜플()과 특정 값 두 개임을 확인!
print (np_array)
[[5 5 5]
 [5 5 5]]


In [57]:
# numpy 에서 제공하는 함수를 사용하는 방법3
np_array = np.eye(3)  # <--- 입력은 a 라고 하면, a x a 의 2차원 행렬을 만든다는 것을 확인!
print (np_array)
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]
프로그래밍 연습
1. 길이가 5이고, 값이 각각 0인 1차원 배열을 만드세요
2. 길이가 10이고, 값이 각각 1인 2x5 배열(행렬)을 만드세요
In [31]:
np_array = np.full((2, 5), 1)
print (np_array)
[[1 1 1 1 1]
 [1 1 1 1 1]]

배열 연산

In [37]:
import numpy as np
x = np.array([[ 0, 2 ], 
              [ 3, 2 ]])
y = np.array([[ 2, 2 ], 
              [ 1, 2 ]])
In [18]:
print (np.add(x, y))
[[2 4]
 [4 4]]
In [20]:
print (np.subtract(x, y))
[[-2  0]
 [ 2  0]]


In [38]:
print (np.multiply(x, y))   # 동일 자리의 1:1 곱셈 
[[0 4]
 [3 4]]
In [39]:
print (np.dot(x, y))        # 행렬 곱셈
[[ 2  4]
 [ 8 10]]
In [23]:
print (np.divide(x, y))
[[ 0.  1.]
 [ 3.  1.]]

10부터 20까지 들어가 있는 2x5 배열(행렬)

In [32]:
import numpy as np

print (np.array(range(10, 21)))
print (np.array(range(10, 20)).reshape((2,5)))
[10 11 12 13 14 15 16 17 18 19 20]
[[10 11 12 13 14]
 [15 16 17 18 19]]
프로그래밍 연습
다음 식을 numpy 라이브러리를 사용해서 계산하세요 (행렬곱셈: A X B)
In [35]:
A = np.array(range(1, 13)).reshape((3,4))
B = np.array(range(1, 13)).reshape((4,3))
print (np.dot(A, B))
[[ 70  80  90]
 [158 184 210]
 [246 288 330]]