본문 바로가기

Programming

[Python][Library] 1. Numpy - 배열을 다루는 라이브러리

반응형

 

NumPy 란?

  • Numerical Python 의 줄임말
     
  • 과학계산용 패키지
    • ndarray (n dimentional array)를 제공
      • 빠르고 효율적인 메모리 사용, 벡터 연산, 브로드캐스팅(확대) 기능을 제공하는 다차원 배열
      • [[1, 2], [1, 2], [[1, 2], [3, 4]]
    • for 문 등 반복문을 작성할 필요없이 전체 배열에 대해 빠른 연산을 제공
    • 배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구
    • 선형대수, 난수 발생기, 푸리에(Fourier) 변환 기능
    • C, C++, 포트란 등 다른 언어로 쓰여진 코드를 통합하는 도구
  • 특징
    • 빠르고 효율적인 다차원 배열 객체 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바이트로 이루어짐
 

Data types — NumPy v1.22 Manual

Array Scalars NumPy generally returns elements of arrays as array scalars (a scalar with an associated dtype). Array scalars differ from Python scalars, but for the most part they can be used interchangeably (the primary exception is for versions of Python

numpy.org

# %%
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 배열 전치와 축 바꾸기

 

 

 
 
 
 
 
 
 
 
 

참고 사이트

 

The Python Tutorial — Python 3.10.1 documentation

The Python Tutorial Python is an easy to learn, powerful programming language. It has efficient high-level data structures and a simple but effective approach to object-oriented programming. Python’s elegant syntax and dynamic typing, together with its i

docs.python.org

 

NumPy quickstart — NumPy v1.21 Manual

NumPy provides familiar mathematical functions such as sin, cos, and exp. In NumPy, these are called “universal functions” (ufunc). Within NumPy, these functions operate elementwise on an array, producing an array as output. See also all, any, apply_al

numpy.org

 

NumPy Reference — NumPy v1.21 Manual

This reference manual details functions, modules, and objects included in NumPy, describing what they are and what they do. For learning how to use NumPy, see the complete documentation. Acknowledgements Large parts of this manual originate from Travis E.

numpy.org

 

파이썬 데이터 사이언스 Cheat Sheet: NumPy 기초, 기본

NumPy 기본 사용법을 정리합니다. 사용법, 가이드, 문서, 메뉴얼, 기본 문서

taewan.kim

 

 

 

 

1. Numpy 패키지

numpy documentation : https://numpy.org/doc/stable

 

Overview — NumPy v1.21 Manual

 

numpy.org

 

1) 배열생성

# numpy 패키지를 np라는 이름으로 사용하기 위해 불러들임
import numpy as np

# np.array()는 리스트, 튜플, 배열로 부터 ndarray를 생성

# 리스트를 가지고 1차원 배열을 생성
a = np.array([12345])
print(a)
print(type(a))
print(a.ndim) # 배열의 차원 출력
print(a.shape) # 배열의 모양(크기) 출력

 

# 리스트를 가지고 2차원 배열을 생성
# array() 안에 하나의 리스트만 들어가므로 리스트안에 리스트를 포함하여 생성
b = np.array([[123], [ 456]]) 
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(1202
print(a)

 

- 배열생성 실습

#실습1
#1부터 30까지 +3씩 증가시키는 배열을 생성하시오. 
a = np.arange(1303
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((23),4
print(a)
 
# 대각선으로는 1이고 나머지는 0인 3 * 3 배열을 생성
a = np.eye(3
print(a)
 
# 임의의 값으로 채워진 배열 생성
a = np.random.random((24)) 
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((43)) 

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[11:]
 
 

배열 인덱싱 & 슬라이싱 실습

m = np.array([[ 0,  1,  2,  3,  4],
            [ 5,  6,  7,  8,  9],
            [1011121314]])
 
 
# 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