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()이 아님!!!!