HanJW96 2024. 5. 23. 20:35

실습은 꽤나 길게 했지만 , 주요하게 기억해야될 넘파이 문법에 대해서만 정리해놓으려 한다 .

 

 

numpy? 파이썬에서 배열을 만드는 패키지 !

 

배열과 리스트의 차이점

 

1. 처음부터 저장할 갯수 지정함 (리스트는 저장 갯수에 제한없음)
2. 한 가지 종류의 값만 저장함 (리스트는 여러 종류를 저장함)
3. 리스트와 동일하게 저장 순번(index)를 사용함

ar = np.array([0,1,2,3,4,5,6,7,8,9])
print(ar)
print(type(ar))  # <class 'numpy.ndarray'>
print(len(ar))

 

# 배열은 벡터화(각 인덱스값 별로) 연산이 가능하다.
# 리스트일 때의 백터화 연산 처리 예 :
datalist = [0,1,2,3,4,5,6,7,8,9]
print(type(datalist))   # <class 'list'>

# 리스트 안의 각 값을 2배로 증가 처리한다면
double_datalist = []
for data in datalist:
    double_datalist.append(data * 2)

print(double_datalist)

# 위의 처리를 배열로 바꿔서 백터화 연산을 처리한다면
print(ar * 2) # ndarray 에서 내부적으로 각 인덱스 값들에 대해 *2 연산이 수행됨

# 리스트에 * 2 를 적용하면
print(datalist * 2)     # 리스트가 2번 출력됨

리스트는 곱셈을 하면 2번 출력되지만 배열은 백텨연산이 가능!

 

#배열의 백터화연산

# 배열의 백터화 연산은 비교연산, 논리연산, 산술연산이 가능함
# ndarray 클래스에 각 연산자에 대한 연산자오버로딩가 작성 제공이 되고 있음
ar1 = np.array([1,2,3])
br1 = np.array([10, 20, 30])

print(2 * ar1 + br1)    # 2 * ar1[0] + br1[0], 2 * ar1[1] + br1[1], 2 * ar1[2] + br1[2]
print(ar1 == 2)  # ar1[0] ==2, ar1[1] ==2, ar[2] ==2
print(br1 > 10)     # br1[0] > 10, br1[1] > 10, br1[2] > 10
print((ar1 ==2) & (br1 > 10))

 

배열은 2차원 3차원배열도 만들 수 있다.  학부시절에 하던 행렬계산을 하기 위함인듯 .

 

AI모델은 모두 이런식으로 계산한다고 한다.

# 2차원 배열 만들기
# 1차원배열 여러 개 (값 갯수가 같아야 함)를 하나로 묶으면 => 2차원배열
# 1차원배열 == 백터(Vector)
# 2차원배열 == 매트릭스(Matrix) : 행과 열로 구성된 행렬 형태
# [[......],[,,,,,,][,,,,,]] : list of list 형태일 것임
tar = np.array([[0, 1, 2],[3, 4, 5]])     # 2행 3열 matrix
print(tar)
print(len(tar)) # 2: 행갯수
print(len(tar[0])) # 3 : 열갯수

# 2차원배열의 각 값에 접근 : 배열변수[행순번][열순번]
# 행(Row) : 세로방향(줄, 높이), 열 (Column) : 가로방향 (칸, 너비)
# 2중 for 문으로 각 인덱스 위치의 값을 처리함
for row_index in range(len(tar)):   # 0, 1 : 행반복
    for col_index in range(len(tar[row_index])):    # 0, 1, 2 : 열반복
        print('tar[{}][{}] : {}'.format(row_index, col_index, tar[row_index][col_index]))
        
        
# 3차원배열 만들기
# 값의 종류가 같고, 행과 열 갯수가 같은 2차원 배열들의 묶음
# 면(깊이, depth), 행(줄, row), 열(칸, column) 로 구성됨 == Tensor (텐서)라고 함
thar = np.array([[[1,2,3,4],[5,6,7,8], [9,10,11,12]],           # 0면
                    [[1,2,3,4],[5,6,7,8], [9,10,11,12]]])   # 1면
print(thar) # 2면 3행 4열
print(len(thar)) # 면 갯수
print(len(thar[0])) # 0면의 갯수  == 행갯수
print(len(thar[1])) # 1면의 갯수 == 행갯수
print(len(thar[0][0])) # 0면 0행의 갯수 == 열 갯수

empty() 함수!

빈배열 생성시 사용. 근데 빈배열이라 해놓고 쓰레기값이 남아있음.

# empty() 함수
# 값이 기록되지 않은 빈 배열 생성시 사용함 : 배열 생성 시간이 짧아짐 (초기화 시간이 제외됨)
gar = np.empty((4,3))
print(gar)  # 메모리에 배열공간을 만듬. 메모리에 이전에 기록되어있던 값들이 남아있음.(쓰레기값) 그것이 출력됨. 자바는 변수선언을 할 때 무조건 기본값이 들어감. ?? 근데 왜 바뀌지
# 해당 인덱스에 값을 가록하면, 쓰레기값은 삭제됨

 

이전에 기록되어있던 값들이 나오는거라는데, 실행할때마다 결과가 달라서 찾아보니 실행할때마다 다른공간에 할당하기 때문이어서 라고 한다. 

 

arange()함수 초기값넣기

# arange() 함수
# 파이썬의 range() 함수와 같음
# 배열 생성시에 지정한 범위의 값들을 초기값으로  기록해 넣을 때 사용함
# 초기값, 종료값, 증가치 로 설정하면, 규칙에 따라 증가하는 수열을 만듦
har = np.arange(10)   # 10개를 가진 1차원배열 생성,  0 ~ 9 까지의 값들로 초기화함
print(har)

 

tile() 함수 말그대로 바닥에 타일을 깔듯이 같은 배열 여러개를 복사해서 붙여줌(?)

# tile() 함수 : 배열을 지정한 횟수만큼 복사해서 연결함
# tile (배열변수, 열반복횟수), tile(배열변수, (행반복, 열반복))
dar = np.array([[1,2,3],[4,5,6]])   # 2행 3열
dar1 = np.tile(dar, 2)
print(dar1)     # 각 행의 열이 2번 반복됨 => 2행 6열이 됨

dar2 = np.tile(dar,(3,2))   # 행으로 3번 열로 2번
print(dar2) # 6행 6열이 됨

(결과값)

 

 

 

 

기초 통계 함수들 

오랜만에 보니 반가웠다

 

# 기술 통계 (descriptive statistatics) : 통계 계산용 함수를 말함
# 데이터 갯수(count), 평균(mean, average), 분산(variance), 표준편차(standard deviation)
# 최대값(maximum) , 최소값(minimum), 중앙값(median), 사분위수(quartile)

x = np.array([18, 5, 10, 23, 19, -8, 10, 0, 0, 5, 2, 15, 8, 2, 5, 4, 15, -1, 4, -7, -24, 7, 9, -6, 23, -13])
print(x)

# 데이터 갯수 : len()
print(len(x))

# 평균 : np.mean(배열변수)
print(np.mean(x))

# 표본 분산 (sample varience) : 데이터와 평균 간의 거리의 제곱의 평균
print(np.var(x))
print(np.var(x, ddof=1))    # 비편향 분산

# 표준 편차 : 표본 분산의 양의 제곱근, ss 라고 표시함
print(np.std(x))

# 최대값, 최소값 ,중앙값
print(np.max(x))
print(np.min(x))
print(np.median(x))