반응형
NumPy 란?
- Numerical Python 의 줄임말
- 과학계산용 패키지
- ndarray (n dimentional array)를 제공
- 빠르고 효율적인 메모리 사용, 벡터 연산, 브로드캐스팅(확대) 기능을 제공하는 다차원 배열
- [[1, 2], [1, 2], [[1, 2], [3, 4]]
- for 문 등 반복문을 작성할 필요없이 전체 배열에 대해 빠른 연산을 제공
- 배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구
- 선형대수, 난수 발생기, 푸리에(Fourier) 변환 기능
- C, C++, 포트란 등 다른 언어로 쓰여진 코드를 통합하는 도구
- ndarray (n dimentional array)를 제공
- 특징
- 빠르고 효율적인 다차원 배열 객체 ndarray (n-dimensional array)
- 데이터 분석 시 데이터 컨테이너 역할(데이터를 담는 그릇)
- 목적 : 데이터 분석에서 빠른 연산을 위해 자주 사용하는 기능
-
1. 배열에서 데이터 변경, 정제, 부분 집합, 필터링의 빠른 수행
-
2. 정렬, 유일 원소 찾기, 집합 연산
-
3. 통계 표현과 데이터의 수집/요약
-
4. 여러 데이터의 병합, 데이터 정렬과 데이터 조작
-
- 설치
- `pip install numpy`
- 불러오기
- 표준 NumPy의 컨벤션을 import numpy as np로 사용
NumPy 예제 코드
1. NumPy ndarray: 다차원 배열 객체
1.1 ndarray 사용
#%%
import numpy as np
lst = [1, -2, -3, 4, 5, 6]
arr = np.array(lst)
arr
arr*3
arr+arr
[참고] 리스트의 산술 연산
# %%
lst * 3
lst + lst
1.2 ndarray 생성
# %%
# 1차원 배열
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
arr1
# %%
# 2차원 배열
data2 = [[1,2,3,4], [5,6,7,8]]
arr2 = np.array(data2)
arr2
# %%
arr1.ndim
arr2.ndim
# %%
arr1.shape
arr2.shape
# %%
arr2.reshape((4,2))
# %%
arr2.ravel()
# %%
arr2.flatten() # 항상 복사본 생성
[참고] np.array 는 생성될 때 적절한 자료형을 선택 한다
arr1.dtype
arr2.dtype
np.zeros(): 0 으로 초기화된 배열 생성
np.zeros(10)
np.zeros((3,6)) ## 3행 6열
np.empty(): 초기화 되지 않은 배열 생성
np.empty((2,5))
np.arange(): 파이썬 range() 함수의 배열 버전
np.arange(15)
함수 | 설명 |
array | 입력 데이터(리스트, 튜플, 배열 또는 다른 순차형 데이터)를 ndarray로 변환하며 dtype이 명시되지 않은 경우에는 자료형을 추론하여 저장한다. 기본적으로 입력 데이터는 복사된다. |
asarray | 입력 데이터를 ndarray로 변환하지만 입력 데이터가 이미 ndarray일 경우, 복사가 되지 않는다. |
arange | 내장 range 함수와 유사하지만 리스트 대신 ndarray를 반환한다. |
ones, ones_like | 주어진 dtype과 주어진 모양을 가지는 배열을 생성하고 내용을 모두 1로 초기화한다. ones_like는 주어진 배열과 동일한 모양과 dtype을 가지는 배열을 새로 생성하여 내용을 모두 1로 초기화한다. |
zeros, zeros_like | ones, ones_like와 같지만 내용을 0으로 채운다. |
empty, empty_like | 메모리를 할당하여 새로운 배열을 생성하지만 ones나 zeros처럼 값을 초기화하지는 않는다. |
eye, identity | N x N 크기의 단위 행렬을 생성한다(좌상단에서 우하단을 잇는 대각선은 1로 채워지고 나머지는 0으로 채워진다). |
1.3 ndarray 의 자료형
dtype로 자료형을 알 수 있다.
- 산술 데이터의 dtype은 float, int 같은 자료형의 이름과 하나의 원소가 차지하는 비트로 이루어짐
- 파이썬의 float 객체에서 사용되는 부동소수점 값은 8바이트 혹은 64바이트로 이루어짐
# %%
arr1 = np.array([1,2,3], dtype=np.float32)
arr1
# %%
arr2 = np.array([1,2,3], dtype=np.float64)
arr2
# %%
arr1.dtype, arr2.dtype
타입 변경 : astype() 메소드
# %%
arr = np.array([1,2,3,4,5])
arr
arr.dtype
f_arr = arr.astype(np.float64)
f_arr
f_arr.dtype
arr.dtype
arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr
arr.astype(np.int32)
num_str = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
num_str
num_str.astype(float)
[참고] dtype 축약 코드
종류 | Type Code | 설명
:---|:---|:---
int8, uint8 | i1, u1 | 부호가 있는 8비트(1바이트) 정수형과 부호가 없는 8비트 정수형
int16, uint16 | i2, u2 | 부호가 있는 16비트 정수형과 부호가 없는 16비트 정수형
int32, uint32 | i4, u4 | 부호가 있는 32비트 정수형과 부호가 없는 32비트 정수형
int64, uint64 | i8, u8 | 부호가 있는 64비트 정수형과 부호가 없는 64비트 정수형
float16 | f2 | 반정밀도 부동소수점
float32 | f4 or f | 단정밀도 부동소수점 C 언어의 float 형과 호환
float64 | f8 or d | 배정밀도 부동소수점 C 언어의 double 형과 파이썬의 float 객체와 호환
float128 | f16 or g | 확장 정밀도 부동소수점
bool | ? | True, False 값을 저장하는 불리언형
object | O | 파이썬 객체형
string_ | S | 고정 길이 문자열형, 길이가 10인 문자열의 dtype은 S10
unicode_ | U | 고정 길이 유니코드형(예: U10)
# %%
emp_uint32 = np.empty(8, dtype='u4')
emp_uint32
1.4 배열과 스칼라 간의 연산
- **배열은 for 반복문을 작성하지 않고 데이터를 일괄처리할 수 있다(벡터화)**
- 같은 크기의 배열 간 산술연산은 배열의 각 요소 단위로 적용
# %%
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr * 3)
print(arr * arr)
print(arr - arr)
print(1 / arr)
print(arr ** 0.5)
1.5 인덱싱 (색인) 과 슬라이싱
# %%
arr = np.arange(10)
arr
arr[5]
arr[5:8]
arr[5:8] = 12
arr
브로드캐스팅
- arr[5:8] = 배열에 스칼라 값을 대입하면 이 값이 필요한 만큼 복사되어 확산 전파
- 파이썬 리스트는 브로드캐스팅 불가
배열 조각은 원본 배열의 View를 리턴 (파이썬 리스트의 슬라이싱은 복사본을 리턴)
- 즉, 데이터는 복사되지 않으며 뷰에 대한 변경은 그대로 원본 배열에 반영
- 복사본이 필요할 경우 arr[5:8].copy()를 사용
Slicing : 사용 예
- [:]: 배열 전체
- [0:n]: 0번째부터 n-1번째까지, 즉 n번 항목은 포함하지 않는다.
- [:5]: 0번째부터 4번째까지,5번은 포함하지 않는다.
- [2:]: 2번째부터 끝까지
- [-1]: 제일 끝에 있는 배열값 반환
- [-2]: 제일 끝에서 두번째 값 반환
# %%
arr = np.arange(10)
arr
# %%
arr_cp = arr[5:8].copy()
# %%
arr_cp[:] = 128
arr_cp
# %%
arr
# %%
2차원, 3차원 배열 제어
# %% 2차원
arr2d = np.array([[1,2,3], [4,5,6], [7,8,9]])
# %%
arr2d.ndim
# %%
arr2d[2]
# %%
arr2d[0][2]
# %%
# ,로도 구분 가능
arr2d[0, 2]
# %% 3차원
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
arr3d
# %%
arr3d.ndim
# %%
arr3d[0]
# %%
arr_org = arr3d[0].copy()
arr_org
# %%
arr3d[0] = 42
# %%
arr3d
# %%
arr3d[0] = arr_org
# %%
arr3d
# %%
arr3d[1, 0]
슬라이스 색인
# %%
arr = np.arange(10)
arr
# %%
arr[1:6]
# %%
arr2d = np.array([[1,2,3], [4,5,6], [7,8,9]])
arr2d
# %%
arr2d[:2]
arr2d[:2, 1:]
행, 열
- 같은 [ ] 안에서는 행과 열 구분
# %%
arr2d[:2, 1:]
# %%
arr2d[:2][1:]
# %%
arr2d[1, :2]
# %%
arr2d[2, :1]
# %%
a=arr2d[:, :1]
# %%
arr2d[:2, 1:] = 0
arr2d
1.6 불리언 색인
1.7 팬시 색인
1.8 배열 전치와 축 바꾸기
참고 사이트
1. Numpy 패키지
numpy documentation : https://numpy.org/doc/stable
1) 배열생성
# numpy 패키지를 np라는 이름으로 사용하기 위해 불러들임
import numpy as np
# np.array()는 리스트, 튜플, 배열로 부터 ndarray를 생성
# 리스트를 가지고 1차원 배열을 생성
a = np.array([1, 2, 3, 4, 5])
print(a)
print(type(a))
print(a.ndim) # 배열의 차원 출력
print(a.shape) # 배열의 모양(크기) 출력
# 리스트를 가지고 2차원 배열을 생성
# array() 안에 하나의 리스트만 들어가므로 리스트안에 리스트를 포함하여 생성
b = np.array([[1, 2, 3], [ 4, 5, 6]])
print(b)
print(b.ndim) # 배열의 차원 출력
print(b.shape) # 배열의 모양 출력
# 지정해준 범위에 대해 배열을 생성
# numpy.arange(start, stop, step, dtype)
?np.arange
# a = np.arange(n) # 0, ..., n-1까지 범위의 지정.
# a = np.arange(i, j, k) # i부터 j-1까지 k씩 증가하는 배열.
# numpy의 arange는 Python의 range와 비슷하지만 배열(array)을 반환한다.
y = np.arange(10)
print(y)
#1부터 19까지 +2씩 적용되는 범위
a = np.arange(1, 20, 2)
print(a)
- 배열생성 실습
#실습1
#1부터 30까지 +3씩 증가시키는 배열을 생성하시오.
a = np.arange(1, 30, 3)
print(a)
2) 배열 초기화
- zeros()는 해당 배열에 모두 0을 삽입
- ones()는 모두 1을 삽입
- zeros_like(), ones_like() 크기를 복사한 배열 생성
- full()은 배열에 사용자가 지정한 값을 넣는데 사용
- eye()는 대각선으로는 1이고 나머지는 0인 2차원 배열을 생성
- random()은 임의의 난수 값으로 채워진 배열을 생성
# 모든값이 0인 2 x 4 배열 생성
a = np.zeros((2,4))
print(a)
# 모든값이 1인 2 x 4 배열 생성
a = np.ones((2,4))
print(a)
b = np.zeros_like(a)
print(b)
c = np.ones_like(b)
print(c)
# 모든 값이 특정 상수(4)인 배열 생성
a = np.full((2, 3),4)
print(a)
# 대각선으로는 1이고 나머지는 0인 3 * 3 배열을 생성
a = np.eye(3)
print(a)
# 임의의 값으로 채워진 배열 생성
a = np.random.random((2, 4))
print(a)
- 배열 초기화 실습
# 실습2
# 모든 값이 0인 4 x 4 배열, 모든 값이 1인 4 x 4 배열, 모든 값이 15인 4 x 3배열, 대각선이 1이고 나머지는 0인 4x4배열, 모든 값이 임의 값으로 채워진 4x3배열을 생성하시오.
a1 = np.zeros((4,4))
a2 = 15*np.ones((4,3))
a3 = np.eye(4)
a4 = np.random.random((4, 3))
print(a1)
print(a2)
print(a3)
print(a4)
3) 배열 연산
배열간 연산은 +, -, *, /의 연산자를 사용할 수 있으며, add(), subtract(), multiply(), divide() 함수를 사용할 수도 있다.
x = np.array([1,2,3])
y = np.array([4,5,6])
b = x + y # 각 배열 요소에 대해서 더함
print(b)
# add() 함수의 결과도 동일함
b = np.add(x, y)
print(b)
- 배열 연산 실습
#실습3
#모든 값이 1인 5 X 3 배열과 모든 값이 6인 5 X 3 배열을 생성하여 +, -, *, / 연산을 수행하고, add, subtract, multiply, divide 함수를 사용했을 때와 비교하시오.
a=np.ones((5,3))
b=np.ones((5,3))*6
a+b
a-b
a*b
a/b
np.add(a,b)
np.subtract(a,b)
np.multiply(a,b)
np.divide(a,b)
4) 배열 인덱싱 & 슬라이싱
배열 인덱싱
#1차원 array
a = np.array([0,1,2,3,4])
a[2]
a[-1]
#다차원 array
a = np.array([[0,1,2], [3,4,5]])
a
#첫번째 행의 첫번째 열
a[0,0]
#마지막 행의 마지막 열
a[-1, -1]
#마지막 행의 마지막에서 두번째 열
a[-1, -2]
배열 슬라이싱
a = np.array([[0,1,2,3], [4,5,6,7]])
a
#첫번째 행 전체
a[0, :]
#두번째 열 전체
a[:, 1]
#두번째 행의 두번째 열부터 끝까지
a[1, 1:]
배열 인덱싱 & 슬라이싱 실습
m = np.array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 1.값 7 인덱싱을 출력하시오.
print(m[1,2])
# 2.값 14 인덱싱을 출력하시오.
print(m[-1,-1])
# 3.배열 [6, 7]슬라이싱을 출력하시오.
print(m[1,1:3])
# 4. 배열 [7, 12]슬라이싱을 출력하시오.
print(m[1:,2])
#5. 배열 [[3,4], [8,9]]슬라이싱을 출력하시오.
print(m[:2,3:])
5) 배열 크기 변형
a = np.arange(12)
print(a)
b = a.reshape(3,4)
print(b)
c = a.reshape(3, -1)
print(c)
# 배열을 1차원으로 만들기
d = c.flatten()
print(d)
배열 크기 변형 실습
#실습
#0에서 30까지 2씩 증가하는 배열을 만들고,행이 2개인 배열을 생성하시오.
a=np.arange(0,31,2)
6) 기술통계
- 데이터의 개수(count)
- 평균(mean)
- 분산(variance) : 편차(=관측값-평균)의 제곱의 평균
- 표준 편차(standard deviation): 분산에 루트를 씌운 값 (자료의 흩어짐 정도)
- 최댓값(maximum)
- 최솟값(minimum)
- 중앙값(median)
- 사분위수(quartile)
x = np.array([18, 5, 10, 23, 19, -8, 10, 0, 0, 5, 2, 15, 8,
2, 5, 4, 15, -1, 4, -7, -24, 7, 9, -6, 23, -13])
#데이터의 갯수
len(x)
#평균
np.mean(x)
#분산
np.var(x)
#표준편차
np.std(x)
print(np.max(x))
print(np.min(x))
print(np.median(x)) #중앙값
print(np.percentile(x, 0)) #최소값
print(np.percentile(x, 25)) #1사분위수
print(np.percentile(x, 50)) #2사분위수 (중앙값)
print(np.percentile(x, 75)) #3사분위수
print(np.percentile(x, 100)) #최댓값
기술통계 실습
0에서 70까지 2씩 증가하는 배열을 만들어서 아래 기술통계값을 구하시오
- 데이터의 개수(count)
- 평균(mean)
- 분산(variance) : 편차(=관측값-평균)의 제곱의 평균
- 표준 편차(standard deviation): 분산에 루트를 씌운 값 (자료의 흩어짐 정도)
- 최댓값(maximum)
- 최솟값(minimum)
- 중앙값(median)
- 사분위수(quartile)
# 0에서 70까지 2씩 증가하는 배열을 만드시오.
a=np.arange(0,71,2)
# 위에서 생성한 배열의 기술통계값을 구하시오. (갯수, 평균, 분산, 표준편차, 최댓값, 최솟값, 중앙값, 사분위수)
len(a)
np.mean(a)
np.var(a)
np.std(a)
print(np.max(a))
print(np.min(a))
print(np.median(a)) #중앙값
print(np.percentile(a, 0)) #최소값
print(np.percentile(a, 25)) #1사분위수
print(np.percentile(a, 50)) #2사분위수 (중앙값)
print(np.percentile(a, 75)) #3사분위수
print(np.percentile(a, 100)) #최댓값
반응형
LIST
'Programming' 카테고리의 다른 글
[Python][Library] 3. matplotlib - 그래프 패키지 (0) | 2021.12.25 |
---|---|
[Python][Library] 2. Pandas - 데이터프레임 패키지 (0) | 2021.12.25 |
[파이썬] 데이터 분석 관련 학습 자료 조사 (0) | 2021.12.19 |
[SQL][문법] 데이터베이스 (0) | 2021.12.19 |
[개념] Visual Studio Code 에 대해 알아보자 (2/2) (0) | 2021.12.18 |