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])
- 로우가 결합됨