파이썬에 리스트, 튜플 , 딕셔너리와 같은 기본 데이터 타입이 있는 것처럼 넘파이에는 다차원 배열을 위한 ndarray 클래스를 제공
1차원 리스트를 넘파이의 array 함수에 전달하면 쉽게 ndarray 객체로 변환 가능
범용적인 용도로 사용되는 파이썬 리스트 타입을 행렬과 다차원 배열에 최적화된 ndarray 타입으로 변환 !
import numpy as np
data = [1,2,3,4]
arr = np.array(data)
print(arr)
print(data)
ndarray 객체는 리스트와 달리 데이터와 데이터 사이에 콤마 구분 기호가 없이 출력
data2 = [[1,2],[3,4]]
arr2 = np.array(data2)
print(arr2)
print(data2)
ndarray 객체의 인스턴스 변수를 사용해서 저장된 데이터의 정보를 조회 가능
shape 은 ndarray의 크기 정보를, ndim 은 차원 정보, dtype 은 데이터 타입을 표현
data = [
[1],
[2],
[3],
[4]
]
c = np.array(data)
print(c.shape)
🟨 zeros | ones
numpy 는 특정 값으로 구성된 ndarray 객체를 생성하는 몇 가지 함수를 제공
대표적으로 zeros 와 ones 함수가 있다.
zeros
는 0으로 채워진 ndarray를 리턴
ones
는 1로 채워진 ndarray 를 리턴함
zeros 와 ones 는 기본적으로 float 타입으로 데이터를 저장함 . !
튜플 형태로 전달하면 다차원 배열을 생성 할 수 있다.
print(np.zeros(3))
print(np.ones(3))
print(np.zeros((3,4)))
🟨 arange
넘파이의 arrange 함수는 최대 세 개의 파라미터를 입력 가능하며 규칙적인 숫자를 갖는 ndarray 객체를 반환함
하나의 파라미터를 입력하면 0부터 순차적으로 증가하는 숫자를 생성하며, 두 개룰 사용하면 시작과 끝 범위를 표현해서 범위내의 순차 증가하는 숫자를 만들 수 있다.
print(np.arange(5))
print(np.arange(1,10,2))
🟨 reshape
넘파이 배열의 shape을 변경할 수 있는 reshape 함수!
ndarr1 = np.arange(6)
print(ndarr1)
ndarr2 = ndarr1.reshape(2,3)
print(ndarr2)
대신 행과 열의 개수는 원본 데이터를 고려하여 입력해야 한다.
넘파이 주요 데이터 타입
구분 | 넘파이 타입 | 축약어 | 설명 |
---|---|---|---|
불린형 | bool | b1 | True, False |
정수형 | np.int8 np.int16 np.int32 np.int64 | i1 i2 i4 i8 | |
np.uint8 np.uint16 np.uint32 np.uint64 | u1 u2 u4 u8 | ||
실수형 | np.float16 np.float32 np.float64 | f2 f4 f8 | |
복소수형 | np.complex64 np.complex128 | c8 c16 | |
문자형 | string | s |
astype 을 활용해서 기존의 ndarray를 다른 타입으로 변경도 가능 !
arr = arr.astype('int8')
print(arr)
print(arr.dtype)
높은 비트를 사용하는 실수 데이터 타입이 더 높은 정밀도를 갖는다.
16비트 실수와 32비트 실수로 1.3333을 표현해보면
a16 = np.array([1.33333],dtype=np.float16)
a32 = np.array([1.33333],dtype = np.float32)
print(a16)
print(a32)
[1.333]
[1.33333]
16 비트는 표현할 수 있는 범위가 32비트 보다 작아서 값을 제대로 표현하지 못함
높은 비트로 데이터를 표현하는 것이 정확하지만, 저장공간을 고려해야 함 !
🟨 nan | inf
넘파이에는 무한대와 결측치를 표현하는 특수한 데이터가 존재
nan 은 Not a number 의 약자로 숫자가 아닌 값 혹은 정의되지 않은 숫자를 의미. inf 혹은 -inf 는 무한대의 숫자를 뜻함
print(np.nan , type(np.nan))
print(np.inf, type(np.inf))
print(-np.inf,type(-np.inf))
nan <class 'float'>
inf <class 'float'>
-inf <class 'float'>
세 개의 특수한 값을 float 형임을 알 수 있다 !
넘파이는 파이썬 리스트를 확장해서 만들었기 때문에 리스트가 제공하는 대부분의 기능 사용 가능
따라서 리스트의 인덱싱과 동일하게 인덱스를 활용 가능
print(arr)
print(arr[1])
print(arr[:2])
리스트의 기능에 추가해서 불연속적인 데이터를 슬라이싱 할 수 있다
target = [1,3] #가져오려는 데이터의 인덱스를 리스트로 정의한다
print(arr[target]) #1번,3번 위치의 데이터가 슬라이싱된다.
ndarray 는 한 번에 컬럼의 슬라이싱 할 수 있다! 인덱싱과 비슷하게 [행,열] 정보를 차례로 전달하여 슬라이싱 가능하다
arr = np.arange(20).reshape(4,5)
print(arr[:2])
print(arr[:,:2])
[[0 1 2 3 4] [5 6 7 8 9]]
[[ 0 1] [ 5 6]
[10 11] [15 16]]
파이썬에서는 반복문을 사용해서 전체 데이터에 연산을 적용했던 것과는 달리 연산이 전체 데이터로 확장된다.
반복문을 사용하지 않아서 코드가 짧아지고 읽기도 좋음
a = np.array([1,2,3])
b = np.array([2,3,4])
print(a+b)
print(a*b)
print(a%b)
[3 5 7]
[ 2 6 12]
[1 2 3]
스칼라 연산은 전체 데이터에 확장 적용된다!
print(a+3)
[4 5 6]
이처럼 연산이 확장 적용되는 것을 브로드 캐스팅이라고 한다
브로드 캐스팅이 적용되기 위해서는 다음 조건 중 하나라도 충족해야 한다
[ 조건 1 ] 뒤 축의 길이가 같다
[ 조건 2 ]비교하는 어느 한 축의 길이가 1이다
작은 크기의 ndarray가 확장 가능한지를 체크해야 함
numpy와의 연산은 브로드캐스팅이 적용되어 전체 데이터에 연산이 반복 적용된다.
비교 연산
arr = np.array([10,20,30])
print(arr>10)
[False True True]
인덱스의 리스트로 슬라이싱한 것과 유사하게 True 와 False 가 담긴 ndarry 로 조건이 참(True) 인 데이터만을 슬라이싱할 수 있다
arr = np.array([10,20,30])
print(arr[[False,True,True]])
[20,30]
arr = np.array([10,20,30])
cond = arr >10
print(arr[cond])
얻어온 조건이 모두 참인지의 여부를 확인하기 위해 any 나 all 함수를 이용할 수 있다.
cond.all()
cond.any()
arr = np.array([10,20,30])
cond = arr>10
arr[cond] = 1 #조건을 충족하는 데이터를 선택해서 1로 업데이트
arr[~cond] = 0 # 조건을 충족하지 않는 경우 0으로 업데이트
print(arr)
넘파이는 수치 연산과 관련된 다양한 함수와 메서드를 제공
파이썬이 기본적으로 제공하는 함수도 기능을 확장에서 메서드로 제공한다.
🟨 sum
print(arr.sum())
print(arr.sum(axis = 1)) #axis 옵션 설정 가능
sum 메서드 뿐만 아니라 min, max, mean, std, var 메서드를 사용할 수 있다.
np.random.randint(3)
np.random.randint(46,size=5)
🟨 linspace
차트를 그릴 때 빈번히 사용하는 함수. 첫 번째로 시작 값, 두 번째로 종료 값, 세 번째로 분할 지점의 수를 입력받아 균일한 크기의 구간으로 분할
x = np.linspace(0,10,3)
print(x)
[ 0. 5. 10. ]
🟨 stack
여러 개의 ndarray 를 하나로 합칠 때 사용
a = np.arange(4)
b = np.arange(4,8)
c = np.vstack([a,b])
print(c)
[[0 1 2 3]
[4 5 6 7]]
'금융 데이터 분석을 위한 파이썬 판다스' 책을 참고하였습니다