Posts 넘파이(Numpy) 기초 (2)
Post
Cancel

넘파이(Numpy) 기초 (2)

1. 넘파이(Numpy) 기초(1) summary


1.1 넘파이(Numpy) 기초(1) summary

  • numpy : 선형대수를 빠르게 연산해주는 패키지
  • 행렬의 생성 1 : ndarray data 타입으로 생성 (np.array, iteralbe)
  • 헹렬의 생성 2 : ones(항등행렬), zeros(영행렬)
  • 행렬 데이터 선택 : array[x,y,z] 바깥쪽 차원부터 안쪽 차원으로 선택
  • 행렬 데이터 수정
    • 행렬 데이터를 선택 후
    • =, >(할당연산자) 값(scala, vector, matrix)
    • 브로드 캐스팅 개념 : 3x3 행렬 * 3x1 벡터는 벡터와 행렬이 인덱스에맞게 연산됨
  • arange : list에서 사용하는 range와 같으나, 결과가 ndarray 타입으로 생성됨


1.2 넘파이(Numpy) Quiz

1.2.1 Fiz Buz Quiz

  • 100 ~ 130까지 랜덤한 숫자를 가지는 8 * 8 행렬을 만들고,
  • 3의 배수는 fiz, 5의 배수는 buz, 3과 5의 배수는 fbz 문자로 변환
  • 랜덤 행렬 데이터 생성
1
datas = np.random.randint(100,130, size=(8,8))
  • 데이터 타입이 정수이므로 문자열로 바꿔줘야함(ndarray.astype())


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 100 ~ 130까지 랜덤한 숫자를 가지는  8 * 8 행렬을 만들기
datas = np.random.randint(100, 130, size = (8,8))

# 3의 배수, 5의 배수, 15의 배수 위치값에 대한 True, False matrix 새성
idx3 = datas % 3 == 0
idx5 = datas % 5 == 0
idx15 = datas % 15 == 0

# 데이터 타입을 str로 변환
result = datas.astype('str')

# True, False matrix를 이용하여 특정 조건의 데이터를 선택 후 브로드 캐스팅하게 값을 대입
result[idx3] = 'fiz'
result[idx5] = 'buz'
result[idx15] = 'fbz'

result
1
2
3
4
5
6
7
8
9
array([['fiz', 'fiz', 'buz', 'buz', 'buz', 'fiz', '121', '119'],
       ['109', 'buz', 'fbz', 'fiz', 'buz', 'fiz', 'fiz', '106'],
       ['119', 'fbz', '103', 'fiz', 'fiz', '107', 'fiz', '104'],
       ['fiz', 'fiz', '106', 'fbz', 'fiz', '103', 'fiz', 'fiz'],
       ['122', 'fiz', '119', '109', '116', '128', '119', 'fiz'],
       ['116', 'buz', 'buz', 'buz', 'fiz', '101', '103', '128'],
       ['119', '127', 'fiz', '118', '101', '107', 'buz', '116'],
       ['127', 'fbz', 'fbz', 'fiz', '113', '106', 'buz', 'fiz']],
      dtype='<U21')


1.2.2 Min Max Quiz

  • 1 ~ 20까지 랜덤한 숫자를 가지는 5 * 5행렬 생성
  • 최대값에는 MAX, 최소값에는 MIN 문자열이 들어가도록 치환하는 코드
  • 최대값과 최소값 함수는
    1
    
    np.min(ndarray), np.max(ndarray)
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1 ~ 20까지 랜덤한 숫자를 가지는 5 * 5 행렬 생성
datas = np.random.randint(1, 20, size = (5,5))

# min_num, max_num 찾기
min_num = np.min(datas)
max_num = np.max(datas)

idx_min = datas == min_num
idx_max = datas == max_num

result = datas.astype('str')
result[idx_min] = 'min'
result[idx_max] = 'max'
result
1
2
3
4
5
array([['min', '2', '5', '3', '7'],
       ['min', 'max', '15', '15', '14'],
       ['12', '7', '18', '5', '7'],
       ['18', '11', '15', '2', '2'],
       ['11', '17', '7', '4', '4']], dtype='<U21')

2. 넘파이(Numpy) 실습


2.1 Linspace, Logspace

  • linspace (선형적으로 데이터를 자름) : 설정한 범위에서 선형적으로 분할한 위치의 값을 출력
  • logspace (로그로 데이터를 자름) : 설정한 범위에서 로그로 분할한 위치의 값을 출력


2.1.1 Linspace

1
np.linspace(0, 100, 5)
1
array([  0.,  25.,  50.,  75., 100.])
  • 0부터 100까지 5구간으로 분할한 값을 출력함


2.1.2 Logspace

1
np.logspace(2, 4, 3)
1
array([  100.,  1000., 10000.])
  • log10(x1) = 2, log10(x2) = 3, log10(x3) = 4 지수함수 그래프가 그려짐


2.1.3 연봉 그래프 Quiz

  • 30세의 연봉이 $100000이고 60세의 연봉이 $1000000 일때
  • 연봉이 선형으로 증가, 지수함수로 증가하는 두 경우에서의 40세, 50세 연봉을 출력
1
2
age_30 = 10000
age_60 = 100000
1
np.linspace(age_30, age_60, 4)
1
array([ 10000.,  40000.,  70000., 100000.])
  • 선형으로 증가하는 코드, linspace를 씀


1
np.logspace(np.log10(age_30), np.log10(age_60), 4)
1
array([ 10000.        ,  21544.34690032,  46415.88833613, 100000.        ])
  • 지수 함수로 증가하는 코드


2.2 numpy random - 마지막 숫자가 들어가지 않음

  • seed : 랜덤값을 설정하는 값 (똑같이 섞음)
  • rand : 균등분포로 난수를 발행 (뽑힐 확률이 동일함 주사위 눈)
  • randn : 정규분포로 난수를 발행 (종모양, 0에서 가까운 데이터가 생성될 확률이 높음, 특이값)
  • randint : 균등분포로 정수값을 발생
  • suffle : 행렬 데이터를 섞어줌
  • choice : 특정 확률로 데이터를 선택


2.2.1 Seed

1
2
3
4
5
6
7
8
9
10
np.random.seed(1) #numpy 객체의 seed값을 1로 설정한
result1 = np.random.randint(10, 100, 10)

np.random.seed(1) #numpy 객체의 seed값을 1로 설정한
result2 = np.random.randint(10, 100, 10)

np.random.seed(1) #numpy 객체의 seed값을 1로 설정한
result3 = np.random.randint(10, 100, 10)

result1, result2, result3
1
2
3
(array([47, 22, 82, 19, 85, 15, 89, 74, 26, 11]),
 array([47, 22, 82, 19, 85, 15, 89, 74, 26, 11]),
 array([47, 22, 82, 19, 85, 15, 89, 74, 26, 11]))
  • 랜덤값을 설정하는 값 (똑같이 섞음)
  • seed를 1를 주어서, 여러번 해도 같은 값이 출력됨


2.2.2 Rand

1
np.random.rand(10)
1
2
array([0.18626021, 0.34556073, 0.39676747, 0.53881673, 0.41919451,
       0.6852195 , 0.20445225, 0.87811744, 0.02738759, 0.67046751])
  • 0 ~ 1 까지의 숫자가 10으로 나눈 범위에서 비슷한 갯수로 뽑힘


2.2.3 Randn

1
np.random.randn(10)
1
2
array([ 1.46210794, -2.06014071, -0.3224172 , -0.38405435,  1.13376944,
       -1.09989127, -0.17242821, -0.87785842,  0.04221375,  0.58281521])
  • -1 ~ 1 사이 숫자가 생성되며, 0에 가까운 수가 많이 생성됨 == 정규분포를 따름


2.2.4 Shuffle

1
2
r = np.random.randint(1, 10, size = (3, 4))
r
1
2
3
array([[5, 9, 2, 5],
       [1, 4, 3, 1],
       [5, 3, 8, 8]])


1
2
np.random.shuffle(r)
r
1
2
3
array([[1, 4, 3, 1],
       [5, 9, 2, 5],
       [5, 3, 8, 8]])
  • 순서를 섞음
  • 행벡터만 순서가 바뀜, 모두 바꾸고 싶으면 reshape사용


2.2.5 Choice

1
np.random.choice(5, 10, p = [0.1, 0, 0.4, 0.2, 0.3])
1
array([2, 2, 2, 0, 3, 2, 2, 2, 0, 3])
  • 0 ~ 4 까지의 5개의 숫자를 10번 뽑으며, p(확률값)으로 조정 p값은 sum(1)을 넘을수가 없음


2.3 Unique

1
np.unique(r)
1
array([1, 2, 3, 4, 5, 8, 9])
  • unique한 값을 뽑는 함수


2.3.1 Return_counts

1
2
3
numbers, counts = np.unique(r, return_counts=True)
print(numbers)
print(counts)
1
2
[1 2 3 4 5 8 9]
[2 1 2 1 3 2 1]
  • True로 유니크한 값이 몇번 나왔는지 count해줌


3. 행렬 데이터의 결합


3.1 Concatenate

1
2
3
4
# 데이터 생성 
na1 = np.random.randint(10, size=(2, 3))
na2 = np.random.randint(10, size=(3, 2))
na3 = np.random.randint(10, size=(3, 3))


3.1.1 세로 결합(row가 추가됨), (colunm의 갯수가 같아야함)

1
np.concatenate((na1, na3))
1
2
3
4
5
array([[1, 0, 0],
       [4, 6, 4],
       [5, 6, 3],
       [7, 0, 7],
       [0, 4, 6]])


3.1.2 가로 결합 (column이 추가됨) (row의 갯수가 같아야함, axis = 1을 넣어줘야함)

1
np.concatenate((na2, na3), axis = 1)
1
2
3
array([[8, 8, 5, 6, 3],
       [9, 2, 7, 0, 7],
       [6, 1, 0, 4, 6]])


3.1.3 C_, R_ 로도 행과 열을 지칭하여 결합이 가능함

1
np.c_[np.array([1, 2, 3]), np.array([4, 5, 6])]
1
2
3
array([[1, 4],
       [2, 5],
       [3, 6]])
  • 컬럼이 결합됨


1
np.r_[np.array([1, 2, 3]), np.array([4, 5, 6])]
1
array([1, 2, 3, 4, 5, 6])
  • 로우가 결합됨
This post is licensed under CC BY 4.0 by the author.

넘파이(Numpy) 기초 (1)

판다스(Pandas) 기초(1)