FUNDAMENTAL | 07-1. Array, NumPy

yeonk·2021년 9월 15일
0

aiffel-ai-bootcamp

목록 보기
16/38
post-thumbnail

210915



1. 배열, 통계 데이터


  • 평균은 입력 받은 값의 합산을 통해 바로 구할 수 있지만, 표준편차와 분산을 구하기 위해서는 입력받은 모든 숫자들을 저장해둘 필요가 있다.

  • 데이터 값 전체를 하나의 객체에 순서대로 모아 놓을 수 있어야 사용하기 편리하다.

  • 파이썬의 리스트는 임의의 데이터 타입을 담을 수 있는 가변적 연속열(Sequence)형.
    즉, 파이썬 리스트는 동적 배열(Dynamic Array)





List vs Array


  • list는 별도의 import가 필요없지만 array를 사용하기 위해서는 import 필요
    • 파이썬에서 array는 built-in 아니다.
  • list 안의 element 사이에 다른 타입의 자료형이 허용.
    array는 처음부터 element의 유형을 지정.
    지정되지 않은 다른 타입의 element 추가가 허용되지 않음

  • array는 element들이 연속된 메모리 공간에 배치되며,
    모든 element들의 동일한 크기와 타입을 가져야 함

자료구조, 리스트(List) 와 배열(Array)





시그마 표현


for문, range(), len() 함수 활용

total = 0.0
for i in range(len(X)):
    total = total + X[i]
mean = total / len(X)

print('sum of X: ', total)






중앙값(median)


주어진 숫자를 크기 순서대로 배치할 때 가장 중앙에 위치하는 숫자

  • n이 홀수

    • 중앙값: n/2을 반올림한 순서의 값
  • n이 짝수

    • 중앙값: n/2번째 값과 ((n/2) + 1) 번째 값의 평균






전체 코드 main()



# 값 입력 받기

def numbers():
    X=[]
    while True:
        number = input("Enter a number (<Enter key> to quit)") 
        while number !="":
            try:
                x = float(number)
                X.append(x)
            except ValueError:
                print('>>> NOT a number! Ignored..')
            number = input("Enter a number (<Enter key> to quit)")
        if len(X) > 1:
            return X


# 중앙 값 구하기

def median(nums): 
    nums.sort()
    size = len(nums)
    p = size // 2
    if size % 2 == 0:
        pr = p
        pl = p-1
        mid = float((nums[pl]+nums[pr])/2)
    else:
        mid = nums[p]
    return mid


# 평균 구하기

def means(nums):
    total = 0.0
    for i in range(len(nums)):
        total = total + nums[i]
    return total / len(nums)


# 표준편차 구하기

def std_dev(nums, avg):
   texp = 0.0
   for i in range(len(nums)):
       texp = texp + (nums[i] - avg) ** 2
   return (texp/(len(nums)-1)) ** 0.5

def main():
    X = numbers()
    med = median(X)
    avg = means(X)
    std = std_dev(X, avg)
    print("당신이 입력한 숫자{}의 ".format(X))
    print("중앙값은{}, 평균은{}, 표준편차는{}입니다.".format(med, avg, std))

if __name__ == '__main__':
    main()






2. NumPy(Numerical Python)


과학계산용 고성능 컴퓨팅과 데이터 분석에 필요한 파이썬 패키지

# 설치하기
pip install numpy 






NumPy의 특징


  • 빠르고 메모리를 효율적으로 사용하여 벡터의 산술연산과 브로드캐스팅 연산을 지원하는 다차원 배열 ndarray 데이터 타입을 지원.

  • 반복문을 작성할 필요 없이 전체 데이터 배열에 대해 빠른 연산을 제공하는 다양한 표준 수학 함수를 제공.

  • 배열 데이터를 디스크에 쓰거나 읽을 수 있다. (즉, 파일로 저장한다는 뜻)

  • 선형대수, 난수발생기, 푸리에 변환 가능, C/C++ 포트란으로 쓰여진 코드를 통합.






ndarray


NumPy를 사용하기 위해선, ndarray 객체를 만들어야 한다.
파이썬에서 사용하는 대규모 데이터 집합을 n차원 배열로 담을 수 있다.

arange(), array([])

# 아래 A와 B는 결과적으로 같은 ndarray 객체를 생성합니다.
A = np.arange(5)
B = np.array([0,1,2,3,4])  # 파이썬 리스트를 numpy ndarray로 변환 

C = np.array([0,1,2,3,'4'])  
# ['0' '1' '2' '3' '4'] 결과 반환
# 모든 element의 type이 동일해야하기 때문에






크기(size, shape,ndim)


size: 행렬 내 원소의 개수 / ndarray.size
shape: 행렬의 모양 / ndarray.shape
ndim: 행렬의 축(axis)의 개수 / ndarray.ndim

reshape(): 메소드는 행렬의 모양를 바꿔줌.
모양을 바꾸기 전후 행렬의 총 원소 개수(size)가 맞아야 함.

# 길이 10의 1차원 행렬을 2X5 2차원 행렬로 변경
A = np.arange(10).reshape(2,5)   






type


type()dtype()메소드 구분하기 !!

  • NumPy: numpy.array.dtype

    • NumPy의 원소는 꼭 동일한 데이터 type이어야 함
    • NumPy ndarray의 "원소"의 데이터타입을 반환
    • 필요에 따라 가장 효율적인 방법으로 type을 변화시켜 관리
  • 파이썬: type()

    • 자료형이 반환






특수행렬


NumPy는 수학적으로 의미가 있는 행렬들을 함수로 제공
단위행렬, 0 행렬, 1 행렬

# 단위행렬
np.eye(3)

# 0 행렬
np.zeros([2,3])

# 1행렬
np.ones([3,3])






브로드캐스트(broadcast)


ndarray와 상수, 또는 서로 크기가 다른 ndarray끼리 산술연산이 가능한 기능

# 행렬A 생성
A = np.arange(9).reshape(3,3)

# ndarray A에 2를 상수배 했을 때,
A * 2

# ndarray A에 2를 더했을 때,
A + 2

# 3 X 3 행렬에 1 X 3 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
B = np.array([1, 2, 3])
print(A)
print(B)
A+B

# 3 X 3 행렬에 3 X 1 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
C = np.array([[1], [2], [3]])
print(A)
print(C)
A+C

broadcast






슬라이스와 인덱싱


출처: AIFFEL FUNDAMENTAL_ 7. Data 어떻게 표현하면 좋을까? 배열(array)과 표(table)
# 행렬 A
# A[행 범위, 열 범위]와 같이 표기

A[:,-1]
print(A[:,2:])






random


np.random.randint()
np.random.choice()
np.random.permutation()
np.random.normal()
np.random.uniform()

# 의사 난수를 생성하는 예제입니다. 여러번 실행해 보세요.

print(np.random.random())   # 0에서 1사이의 실수형 난수 하나를 생성합니다. 

print(np.random.randint(0,10))   # 0~9 사이 1개 정수형 난수 하나를 생성합니다. 

print(np.random.choice([0,1,2,3,4,5,6,7,8,9]))   # 리스트에 주어진 값 중 하나를 랜덤하게 골라줍니다.






전치행렬


행렬의 행과 열을 맞바꾸기, 행렬의 축을 서로 바꾸기 등에 사용되는 기능들 arr.T, np.transpose






NumPy로 통계 데이터 계산하기


import numpy as np

# 위 정리에서 사용하였던 함수. 
def numbers():
    X = []
    number = input("Enter a number (<Enter key> to quit)") 
    # 하지만 2개 이상의 숫자를 받아야 한다는 제약조건을 제외하였습니다.
    while number != "":
        try:
            x = float(number)
            X.append(x)
        except ValueError:
            print('>>> NOT a number! Ignored..')
        number = input("Enter a number (<Enter key> to quit)")
    return X



def main():
    nums = numbers()       # 파이썬 리스트. 
    num = np.array(nums)   # 리스트를 Numpy ndarray로 변환.
    print("합", num.sum())
    print("평균값",num.mean())
    print("표준편차",num.std())
    print("중앙값",np.median(num))   # num.median() 이 아님에 유의.

main()

0개의 댓글