평균은 입력 받은 값의 합산을 통해 바로 구할 수 있지만, 표준편차와 분산을 구하기 위해서는 입력받은 모든 숫자들을 저장해둘 필요가 있다.
데이터 값 전체를 하나의 객체에 순서대로 모아 놓을 수 있어야 사용하기 편리하다.
파이썬의 리스트는 임의의 데이터 타입을 담을 수 있는 가변적 연속열(Sequence)형.
즉, 파이썬 리스트는 동적 배열(Dynamic Array)
list 안의 element 사이에 다른 타입의 자료형이 허용.
array는 처음부터 element의 유형을 지정.
지정되지 않은 다른 타입의 element 추가가 허용되지 않음
array는 element들이 연속된 메모리 공간에 배치되며,
모든 element들의 동일한 크기와 타입을 가져야 함
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)
주어진 숫자를 크기 순서대로 배치할 때 가장 중앙에 위치하는 숫자
n이 홀수
n이 짝수
# 값 입력 받기
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()
과학계산용 고성능 컴퓨팅과 데이터 분석에 필요한 파이썬 패키지
# 설치하기
pip install numpy
빠르고 메모리를 효율적으로 사용하여 벡터의 산술연산과 브로드캐스팅 연산을 지원하는 다차원 배열 ndarray 데이터 타입을 지원.
반복문을 작성할 필요 없이 전체 데이터 배열에 대해 빠른 연산을 제공하는 다양한 표준 수학 함수를 제공.
배열 데이터를 디스크에 쓰거나 읽을 수 있다. (즉, 파일로 저장한다는 뜻)
선형대수, 난수발생기, 푸리에 변환 가능, C/C++ 포트란으로 쓰여진 코드를 통합.
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
: 행렬 내 원소의 개수 / ndarray.size
shape
: 행렬의 모양 / ndarray.shape
ndim
: 행렬의 축(axis)의 개수 / ndarray.ndim
reshape()
: 메소드는 행렬의 모양를 바꿔줌.
모양을 바꾸기 전후 행렬의 총 원소 개수(size)가 맞아야 함.
# 길이 10의 1차원 행렬을 2X5 2차원 행렬로 변경
A = np.arange(10).reshape(2,5)
type()
과 dtype()
메소드 구분하기 !!
NumPy: numpy.array.dtype
파이썬: type()
NumPy는 수학적으로 의미가 있는 행렬들을 함수로 제공
단위행렬, 0 행렬, 1 행렬
# 단위행렬
np.eye(3)
# 0 행렬
np.zeros([2,3])
# 1행렬
np.ones([3,3])
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
출처: AIFFEL FUNDAMENTAL_ 7. Data 어떻게 표현하면 좋을까? 배열(array)과 표(table)
# 행렬 A
# A[행 범위, 열 범위]와 같이 표기
A[:,-1]
print(A[:,2:])
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
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()