[Numpy] 넘파이 기본 문법 정리

민정·2023년 2월 10일
0

데이터공부

목록 보기
3/9

파이썬에 리스트, 튜플 , 딕셔너리와 같은 기본 데이터 타입이 있는 것처럼 넘파이에는 다차원 배열을 위한 ndarray 클래스를 제공

넘파이 기초 문법

  • 1차원 리스트를 넘파이의 array 함수에 전달하면 쉽게 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)

대신 행과 열의 개수는 원본 데이터를 고려하여 입력해야 한다.

데이터 타입

넘파이 주요 데이터 타입

구분넘파이 타입축약어설명
불린형boolb1True, False
정수형np.int8 np.int16 np.int32 np.int64i1 i2 i4 i8
np.uint8 np.uint16 np.uint32 np.uint64u1 u2 u4 u8
실수형np.float16 np.float32 np.float64f2 f4 f8
복소수형np.complex64 np.complex128c8 c16
문자형strings
  • 넘파이는 파이썬 기본 타입보다 다양한 데이터 타입을 제공한다.
  • int8과 uint8은 8비트로 숫자를 표현하는 것은 같지만, int8은 음수까지 표현가능하며 uint는 양수만 표현하는 대신 int8보다 더 큰 숫자까지 포함이 가능하다.
  • array 함수에서 dtype 옵션은 생성할 ndarray의 데이터 타입을 지정하는 경우에 사용이 가능하다. 데이터의 범위가 1~3이라면 uint64 보다 int8,uint8이 메모리 관리 측면에서 더 좋음!

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 를 하나로 합칠 때 사용

  • vstack: 수직 방향으로 ndarray 를 이어 붙임
  • hstack: 수평 방향으로 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]]

'금융 데이터 분석을 위한 파이썬 판다스' 책을 참고하였습니다

profile
공부 기록장

0개의 댓글