Aiffel_learning/Data_analysis
1. 데이터분석 기초 : 배열과 표 / Numpy
이유29
2024. 6. 2. 22:03
배열(array) 과 목록(list, 동적배열(Dynamic Array))
: 둘 다 여러 항목을 저장하는 데 사용되는 데이터 구조임
목록 : 다양한 자료형을 저장할때, 형태가 유동적일 때 유용
리스트, 튜플
배열 : 동일한 자료형의 데이터를 처리할때, 빠른 처리속도가 필요할 때 유용
값 삽입 : array.insert(1,5) # array의 두번째 자리에 5를 끼워넣기
목록 | 배열 |
여러 데이터 유형의 요소들을 포함가능 | 동일한 데이터 유형 요소만 포함하는 벡터 |
가변적 연속열(형태가 유동적) | 크기가 고정돼있음 |
쉽게 데이터 수정이 가능 | 삽입, 삭제 비용이 높음 |
짧은 데이터 타입에서 선호됨 | 긴 데이터타입에서 선호됨 |
큰 메모리 소비, 처리속도 느릴 수 있음 | 메모리 크기가 비교적 작음 |
내장함수 사용해 쉽게 작업가능, but 처리속도는 느림 |
직접 연산수행 가능, 처리속도 빠름 |
그냥 출력가능 | 출력하려면 루프사용 |
그냥 사용가능 | array 모듈 import 해와야함 |
https://www.geeksforgeeks.org/difference-between-list-and-array-in-python/
Difference between List and Array in Python - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
NumPy
- 빠르고 메모리를 효율적으로 사용하여
벡터의 산술 연산과 브로드캐스팅 연산을 지원하는 다차원 배열 ndarray 데이터 타입을 지원한다. - 반복문을 작성할 필요 없이 전체 데이터 배열에 대해 빠른 연산을 제공하는 다양한 표준 수학 함수를 제공한다.
- 배열 데이터를 디스크에 쓰거나 읽을 수 있다. (즉 파일로 저장한다)
- 선형대수, 난수발생기, 푸리에 변환 가능, C/C++ 포트란으로 쓰여진 코드를 통합한다.
conda 깔았으면 기본적으로 포함돼있음 (설치여부 확인법 : conda list | grep numpy)
pip 설치 명령어 : pip install numpy
1. numpy 모듈 불러오기
import numpy as np
2. ndararray 객체 만들기
- 대규모 데이터 집합을 n차원 배열로 담을 수 있음
A = np.arange(5)
B = np.array([0,1,2,3,4]) # 파이썬 리스트를 numpy ndarray로 변환
>>> [0 1 2 3 4]
# array이기 때문에 type을 맞춤(문자열->숫자는 안돼서 숫자->문자열로 바꿔버림)
C = np.array([0,1,2,3,'4'])
>>> ['0' '1' '2' '3' '4']
type(A)
>>> <class 'numpy.ndarray'>
x = np.linspace(0, 10, 100) # 0~10까지 균등한 간격으로 100개의 숫자 만들기
3. 크기, 타입 함수
- ndarray.size : 행렬 내 원소의 개수
- ndarray.shape : 행렬의 모양
- ndarray.ndim : 행렬의 axis 개수
- reshape() : 헹렬의 모양을 바꿔줌
- numpy.array.dtype : 원소의 데이터타입을 반환
- type() : 행렬의 자료형을 반환
# 요소의 타입을 object(최상위 범위)로 지정해서라도 타입을 일치시킴
D = np.array([0, 1, 2, 3, [4, 5], 6], dtype=object)
>>> [0 1 2 3 list([4, 5]) 6]
>>> D.type = object
>>> type(D) = <class 'numpy.ndarray'>
4. 특수행렬
np.eye(3)
>>>
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.zeros([2,3])
>>>
array([[0., 0., 0.],
[0., 0., 0.]])
np.ones([3,3])
>>>
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
5. Broadcast 연산 : ndarray와 상수 or 크기가 다른 ndarray끼리 산술연산 가능
print([1,2]+[3,4])
>>> [1, 2, 3, 4]
print([1,2]+3) # 얘는 에러남
>>> TypeError: can only concatenate list (not "int") to list
---------------------------------------------
print(np.array([1,2])+np.array([3,4]))
>>> [4 6]
print(np.array([1,2])+3)
>>> [4 5]
6. 슬라이스와 인덱싱
A = np.arange(9).reshape(3,3)
print("A:", A)
>>> [[0 1 2]
[3 4 5]
[6 7 8]]
# 인덱싱
A[0, 1]
>>> 1
# 슬라이싱
A[:,:]
>>> [[0 1 2]
[3 4 5]
[6 7 8]]
A[:,1:], A[:,-2:]
>>> [[1 2]
[4 5]
[7 8]]
A[1,:2]
>>> array([3, 4])
A[:2, 1:]
>>> array([[1, 2],
[4, 5]])
7. random
# 0에서 1사이의 실수형 난수 하나를 생성합니다.
print(np.random.random())
# 0~9 사이 1개 정수형 난수 하나를 생성합니다.
print(np.random.randint(0,10))
# 0~9 사이 정수형 난수를 (3,3) size의 행렬으로 생성
matrix = np.random.randint(1,10, size=(3,3))
print(matrix)
>>>
[[1 2 1]
[7 9 5]
[6 4 4]]
# 리스트에 주어진 값 중 하나를 랜덤하게 골라줍니다.
print(np.random.choice([0,1,2,3,4,5,6,7,8,9]))
# 무작위로 섞인 배열을 만들어 줍니다.
print(np.random.permutation(10))
# 어떤 분포를 따르는 변수를 임의로 표본추출해 줍니다.
# 평균(loc), 표준편차(scale), 추출개수(size)의 정규분포를 따릅니다.
print(np.random.normal(loc=0, scale=1, size=5))
# 최소(low), 최대(high), 추출개수(size)의 균등분포를 따릅니다.
print(np.random.uniform(low=-1, high=1, size=5))
8. 전치행렬
- arr.T: 행렬의 행과 열 맞바꾸기
- np.transpose: 축을 기준으로 행렬의 행과 열 바꾸기
A = np.arange(24).reshape(2,3,4)
>>>
[ [ [ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11] ]
[ [12 13 14 15]
[16 17 18 19]
[20 21 22 23] ] ]
# A의 전치행렬 : (4,3,2) shape의 행렬
A.T
>>>
[[[ 0 12]
[ 4 16]
[ 8 20]]
[[ 1 13]
[ 5 17]
[ 9 21]]
[[ 2 14]
[ 6 18]
[10 22]]
[[ 3 15]
[ 7 19]
[11 23]]]
# np.transpose는 행렬의 축을 어떻게 변환해 줄지 임의로 지정해 줄 수 있는 일반적인 행렬 전치 함수입니다.
# np.transpose(A, (2,1,0)) 은 A.T와 정확히 같습니다.
B = np.transpose(A, (2,0,1)) # 3번째 축이 처음에, 첫번쨰 축이 두번쨰, 두번째 축이 세번째로 가라
print("A:", A) # A는 (2,3,4)의 shape를 가진 행렬입니다.
print("B:", B) # B는 A의 3, 1, 2번째 축을 자신의 1, 2, 3번째 축으로 가진 행렬입니다.
print("B.shape:", B.shape) # B는 (4,2,3)의 shape를 가진 행렬입니다.
# dot = matrix multiplication
np.array([1,3]).dot(np.array[3,2]) = np.array([1,2])
# matrix aggregation
ndarray.max()
ndarray.min()
ndarray.sum()
# '열'마다 최댓값 출력
ndarray.max(axis = 0)
# '행'마다 최댓값 출력
ndarray.max(axis = 1)
9.통계 계산기능
ndarray.sum() # 합
ndarray.mean() # 평균값
ndarray.std() # 표준편차
np.median(ndarray) # 중앙값 *ndarray.median()이 아님!!!!