넘파이란?
- 파이썬의 고성능 과학 계산용 라이브러리
- 벡터나 행렬 같은 선형대수의 표현법을 코드로 처리
- 사실상의 표준 라이브러리
- 다차원 리스트나 크기가 큰 데이터 처리에 유리
넘파이의 특징
- 속도가 빠르고 메모리 사용이 효율적
- 반복문을 사용하지 않음
- 다양한 선형대수 관련 함수 제공
- C, C++, 포트란 등 다른 언어와 통합 사용 가능
넘파이 배열 객체
np.array함수를 사용하여 배열 생성
import numpy as np
test_array = np.array([1, 4, 5, 8], float)
- 매개변수 1: 배열 정보
- 매개변수 2: 넘파이 배열로 표현하려는 데이터 타입
파이썬 리스트와 넘파이 배열의 차이점
- 텐서 구조에 따라 배열 생성
- 동적 타이핑 지원 안함
- 데이터를 메모리에 연속적으로 나열
배열의 생성
In |
test_array = np.array([1, 4, 5, "8"], float)
print(test_array)
|
Out | [1. 4. 5. 8.] |
- 배열을 실수형으로 선언
- 배열을 출력해보면 값이 모두 실수형
In |
print(test_array.dtype)
|
Out | float64 |
In |
print(test_array.shape)
|
Out | (4, ) |
- dtype는 넘파이 배열의 데이터 타입을 반환
- shape는 넘파이 배열에서 객체(object)의 차원(dimension)에 대한 구성 정보를 반환
1. shape
In |
matrix = [[1,2,5,8], [1,2,5,8],[1,2,5,8]]
np.array(matrix, int).shape
|
Out |
(3, 4)
|
In |
tensor_rank3 = [
[[1, 2, 5, 8], [1, 2, 5, 8], [1, 2, 5, 8]],
[[1, 2, 5, 8], [1, 2, 5, 8], [1, 2, 5, 8]],
[[1, 2, 5, 8], [1, 2, 5, 8], [1, 2, 5, 8]],
[[1, 2, 5, 8], [1, 2, 5, 8], [1, 2, 5, 8]]
]
np.array(tensor_rank3, int).shape
|
Out |
(4, 3, 4)
|
2. dtype
In |
np.array([[1,2,3.5], [4,5,6.5]], dtype=int)
|
Out |
array([[1, 2, 3],
[4, 5, 6]]) |
매개변수 dtype으로 넘파이 배열의 데이터 타입 지정
In |
np.array([[1,2,3.5], [4,5,6.5]], dtype=float)
|
Out |
array([[1. , 2. , 3.5],
[4. , 5. , 6.5]]) |
- dtype를 실수형인 float로 지정한다면 모든 데이터가 실수형으로 저장되는 것을 확인 가능
In |
import sys
np.array([[1,2,3.5], [4,5,6.5]], dtype=np.float64).itemsize
|
Out |
8
|
In |
np.array([[1,2,3.5], [4,5,6.5]], dtype=np.float32).itemsize
|
Out |
4
|
- itemsize 요소로 넘파이 배열에서 각 요소가 차이하는 바이트(byte) 확인
- np.float64로 dtype를 선언하면 64비트, 즉 8바이트 차지
- np.float32로 dtype를 선언하면 32비트, 즉 4바이트 차지
배열의 구조 다루기
In |
x = np.array([[1,2,5,8], [1,2,5,8]])
x.shape
|
Out |
(2, 4)
|
In |
x.reshape(-1,)
|
Out |
array([1, 2, 5, 8, 1, 2, 5, 8])
|
- reshape함수로 배열의 구조를 변경하고 랭크 조절.
- 반드시 전체 요소의 개수는 통일해야한다.
- -1사용 시 나머지 차원의 크기를 지정했을 때 전체요소의 개수를 고려하여 마지막 차원이 자동으로 지정됨
In |
x = np.array(range(8)).reshape(2, 2, 2)
x
|
Out |
array([[[0, 1],
[2, 3]], [[4, 5], [6, 7]]]) |
In |
x.flatten()
|
Out | array([0, 1, 2, 3, 4, 5, 6, 7]) |
- flatten함수는 데이터 그대로 1차원으로 변경
데이터의 개수는 그대로 존재. 배열의 구조만 변한다.
인덱싱과 슬라이싱
1. 인덱싱
인덱싱: 리스트에 있는 값의 상대적인 주소(offset)로 값에 접근
넘파이 배열의 인덱스 표현에는 ','를 지원
-'[행][열]' 또는 '[행, 열]'의 형태
3차원 텐서 이상은 shape에서 출력되는 랭크 순서대로 인덱싱에 접근
In |
x = np.array([[1,2,3], [4,5,6]],int)
x
|
Out |
array([[1, 2, 3],
[4, 5, 6]]) |
In |
x[0][0]
|
Out | 1 |
In | x[0, 2] |
Out | 3 |
In | x[0, 1] = 100 x |
Out | array([[ 1, 100, 3], [ 4, 5, 6]]) |
2. 슬라이싱
슬라이싱: 인덱스를 사용하여 리스트 일부를 잘라내어 반환
넘파이 배열은 행과 열을 나눠 슬라이싱 할 수 있다.
In |
x = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
x[:,2:]
|
Out |
array([[ 3, 4, 5],
[ 8, 9, 10]]) |
- x는 2행 5열인 행렬
- x[:,2:]는 행 부분은 행 전체, 열 부분은 인덱스가 2 이후의 값
In |
x[1, 1:3]
|
Out |
array([7, 8])
|
- x[1, 1:3]은 행 부분은 첫 번째 행만을 의미
- 열 부분 1:3은 열이 1부터 2까지의 값을 추출
In |
x[1:3]
|
Out | array([[ 6, 7, 8, 9, 10]]) |
- 행렬 전체의 행의 개수가 2 이기 때문에 이를 넘어가는 인덱스는 무시
증가값(step): 리스트에서 데이터의 요소를 호출할 때 데이터를 건너뛰면서 반환
'[시작 인덱스:마지막 인덱스:증가값]'의 형태
각 랭크에 있는 요소별로 모두 적용할 수 있다.
In |
x = np.array(range(15), int).reshape(3, -1)
x
|
Out | array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) |
In |
x[:,::2]
|
Out | array([[ 0, 2, 4], [ 5, 7, 9], [10, 12, 14]]) |
In |
x[::2,::3]
|
Out | array([[ 0, 3], [10, 13]]) |
배열 생성 함수
1. range
- range함수와 같이 차례대로 값을 생성
- '(시작 인덱스, 마지막 인덱스, 증가값)'으로 구성
- range함수와 달리 증가값에 실수형이 입력되어도 값을 생성할 수 있음
- 소수점 값을 주기적으로 생성할 때 유용
In |
np.arange(10)
|
Out | array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) |
In |
np.arange(-5, 5)
|
Out | array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) |
In |
np.arange(0, 5, 0.5)
|
Out | array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]) |
2. ones, zeros, empty
- ones 함수: 1로만 구성된 넘파이 배열을 생성
- zeros 함수: 0으로만 구성된 넘파이 배열을 생성
- empty 함수: 활용 가능한 메모리 공간 확보하여 반환
ones와 zero는 먼저 shape의 크기만큼 메모리를 할당하고 그곳에 값을 채움
해당 메모리 공간에 값이 남았을 경우 그 값을 함꼐 반환
- 생성 시점에서 dtype를 지정해주면 해당 데이터 타입으로 배열 생성
In |
np.ones(shape=(5, 2), dtype=np.int8)
|
Out | array([[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]], dtype=int8) |
In |
np.zeros(shape=(2,2), dtype=np.float32)
|
Out | array([[0., 0.], [0., 0.]], dtype=float32) |
In |
np.empty(shape=(2,4), dtype=np.float32)
|
Out | array([[0. , 1.875 , 0. , 2.25 ], [0. , 2.3125, 0. , 2.5 ]], dtype=float32) |
3. ones_like, zeros_like, empty_like
- ones_like 함수: 기존 넘파이 배열과 같은 크기로 만들어 내용을 1로 채움
- zeros_like 함수: 기존 넘파이 배열과 같은 크기로 만들어 내용을 0으로 채움
- empty_like 함수: 기존 넘파이 배열과 같은 크기로 만들어 빈 상태로 만듦
In |
x = np.arange(12).reshape(3,4)
x |
Out | array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) |
In |
np.ones_like(x)
|
Out | array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]) |
In |
np.zeros_like(x)
|
Out | array([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]) |
4. identity, eye, diag
- identity 함수: 단위행렬(i 행렬)을 생성
매개변수n으로 n x n 단위행렬을 생성
In |
np.identity(n=3, dtype=int)
|
Out | array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) |
In |
np.identity(n=4, dtype=int)
|
Out | array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) |
- eye 함수: 시작점과 행렬 크기를 지정, 단위행렬 생성
N은 행의 개수, M은 열의 개수를 지정
k는 열의 값을 기준으로 시작 인덱스
In |
np.eye(N=3, M=5)
|
Out | array([[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.]]) |
In |
np.eye(N=3, M=5, k=2)
|
Out | array([[0., 0., 1., 0., 0.], [0., 0., 0., 1., 0.], [0., 0., 0., 0., 1.]]) |
- diag 함수: 행렬의 대각성분 값을 추출
In |
matrix = np.arange(9).reshape(3,3) matrix
|
Out | array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) |
In |
np.diag(matrix)
|
Out | array([0, 4, 8]) |
In | np.diag(matrix, k=1) |
Out | array([1, 5]) |
통계 분석 함수
- uniform 함수: 균등분포 함수
'np.random.uniform(시작값, 끝값, 데이터개수)'
In |
np.random.uniform(0, 5, 10
|
Out | array([3.87101195, 0.12263269, 0.80780157, 0.65361498, 0.55792293, 3.64577442, 0.93322468, 3.1913397, 1.82159678, 3.64401469]) |
- normal 함수: 정규분포 함수
'np.random.normal(평균값, 분산, 데이터개수)'
In |
np.random.normal(0, 2, 10)
|
Out | array([ 4.92446265, -2.4753182 , -2.12734589, -2.75839296, -0.22365806, -0.93325909, 1.81593553, 1.74506567, 2.20788194, 1.42156357]) |
'Study > AI' 카테고리의 다른 글
Titanic Survival Prediction (1) | 2024.04.10 |
---|---|
넘파이(Numpy) - 비교 연산과 데이터 추출 (0) | 2023.04.09 |
넘파이(Numpy) - 배열 연산 (0) | 2023.04.09 |
데이터의 이해 (0) | 2023.04.02 |
머신러닝의 기초 (0) | 2023.04.02 |