본문 바로가기
개발/데이터분석

2023.05.18 데이터 분석 Numpy(넘파이)

by 상달군 2023. 5. 18.
728x90

1. 넘파이(Numpy)

  • 1-1 ndarray
  • 1-2. ndarray의 data type
  • 1-3. ndarray 슬라이싱
  • 1-4. Fancy 인덱싱
  • 1-5. Boolean 인덱싱


2.행렬 연산

  • 2-1. 연산자
  • 2-2. arange
  • 2-3. sort
  • 2-4. 숫자의 단일 연산


1.Numpy.ipynb

1.넘파이(Numpy)

목적

수학,과학, 수식 계산용 패키지 (우리가 어렵게 연산해야 하는것을 쉽게 사용하게 해주는 라이브러리)


* 자료구조란? 
 - 데이터를 메모리에 저장하는 방식
 - 내가 데이터를 어떻게 사용할지 어떤식으로 저장할지를 정할때 사용


자료구조(ndarray)를 제공[중요함] -> 파이썬의 list(자료구조)보다 속도가 빠르고 적은 메모리를 사용한다.


numpy 설치

 

# numpy 설치 코드 

!pip install numpy


1-1 ndarray

ndarray) 소스코드

list1 = [1,2,3,4]
list2 = [ [1,2,3,4], [5,6,7,8] ]
print(list1)
print(list2)
print(type(list1))
print(type(list1[1])) #요소의 자료형 
print(type(list2))

ndarray) 결과


ndarray) 소스코드

# 형태 자체는 기존 리스트와 다르지 않다. 
# 타입을 찍어보면 자료구조가 다름을 알 수 있다

ndarr1 = np.array([1,2,3,4])
print(ndarr1)
print(type(ndarr1))  # ndarray란? n dimension array

ndarray) 결과


ndarray) 소스코드

# 리스트를 ndarray로 변환하는 방법
# np.array() 괄호 안에 리스트를 넣어 주면 된다. 

ndarr1 = np.array(list1)
ndarr2 = np.array(list2)

print(ndarr1)
print(ndarr2)
print(type(ndarr1))
print(type(ndarr2))

ndarray) 결과


1-2. ndarray의 data type

  • 배열의 특징 -> 배열안에는 같은 타입만 들어갈수있다! int면 모두 int ....
  • ndarray는 list와 다르게 1개의 단일 데이터 타입만 허용 한다.!

ndarray의 data type) 소스코드

# list는 다양한 데이터 타입을 한 변수에 담을수 있다. 

list1 = [1,3.14,'Python', '😎', True]
list1 # 실행
list1[3]

ndarray의 data type) 결과


ndarray의 data type) 소스코드

# 모든 요소가 float로 변경됨 

ndarr2 = np.array([1, 2, 3.14, 4])
ndarr2

# 블린형도 float형으로 변경됨

ndarr3 = np.array([1, 2, 3.14, True])
ndarr3

# 스트링형이 가장 크기 때문에 스트링형으로 모두 변경됨.

ndarr4 = np.array(['1', 2, 3.14, True])
ndarr4

# 요소의 타입과 전체적인 감싸고 있는 타입은 다르다 !

type(ndarr4)

ndarray의 data type) 결과


ndarray의 data type) 소스코드

# 옵션으로 dtype을 주게 되면 타입을 지정해줄 수 있다

ndarr3 = np.array([1, 2, 3.14, True], dtype=int)
ndarr3

# '1'은 문자열이지만 ' '를 제거후 숫자를 가지고 있다고 한다면 숫자로 인식한다.

ndarr4 = np.array(['1', 2, 3.14, True], dtype=int)
ndarr4

ndarray의 data type) 결과


소스코드( 두가지 일을 시키면 에러 )

# ''를자르면 되긴 하지만 3.14는 float형이기때문에 ''을 자르고 float를 int로 바꿔야 한다는 2가지 조건이 생긴다. 
# 조건은 1개만 가능하다. 

ndarr4 = np.array(['1', '2', '3.14', 'True'], dtype=int)

결과


1-3. ndarray 슬라이싱

소스코드

ndarr1 = np.array(['🍓','🍊','🍉','🍌','🍎'])
ndarr1

# 1차원으로 5개의 데이터가 있다고 확인 
ndarr1.shape

결과


ndarray 인덱싱) 소스코드

# 인덱싱

print(ndarr1[0])
print(ndarr1[4])
print(ndarr1[-1])
print(ndarr1[-2])

ndarray 인덱싱) 결과


ndarray 슬라이싱) 소스코드

#슬라이싱 ['🍓','🍊','🍉','🍌','🍎']

print(ndarr1[0:3])
print(ndarr1[2:])
print(ndarr1[:3])

결과


소스코드

# 3행 4열 2차원 배열
ndarr2d = np.array([[1,2,3,4],
                    [5,6,7,8],
                    [9,10,11,12]])

ndarr2d.shape

# 2차원 인데싱

# 같은 표현법
print(ndarr2d[0,2])
print(ndarr2d[0][2])

# 0행 가져오기
print(ndarr2d[0])
print(ndarr2d[0,])
print(ndarr2d[0,:]) # :(클론)은 모든것이라는 뜻도 있다. 

# 0열 가져오기

print(ndarr2d[:, 0])

결과


1-4. Fancy 인덱싱

  • 범위가 아닌 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 활용하는 방법

소스코드

ndarr1= np.array([10, 15, 2, 8, 20, 90, 58, 44, 23, 32])

idx = [2, 5, 9]

ndarr1[idx]


ndarr2d = np.array([[1,2,3,4],
                    [5,6,7,8],
                    [9,10,11,12]])
                    
ndarr2d[[0,1], :]

결과


1-5. Boolean 인덱싱

  • 조건에 대한 필터링을 통해 Boolean값을 이용한 색인을 사용하는 방법

소스코드

ndarr1 = np.array(['🍓','🍊','🍉','🍌','🍎'])
selValue = [True,False,True,True,False]

# True값만 출력된다. 
# ndarray안에 있는 요소의 갯수와 Boolean의 요소 갯수가 꼭!!! 같아야 한다 !

ndarr1[selValue]

결과

소스코드

ndarr2d = np.array([[1,2,3,4],
                    [5,6,7,8],
                    [9,10,11,12]])
                    
# Boolean형태로 바뀌면서 '7'보다 크면 True, 작으면 False

ndarr2d > 7


# 7보다 큰 녀석들을 뽑아줘. 

ndarr2d[ndarr2d > 7]

결과


2.행렬 연산

  • 덧셈, 뺄셈, 곱셈, 나눗셈은 shape(행과열)가 같아야 함. [다르면 에러]
  • 같은 position끼리 연산한다.
  • 내적(dot product)은 맞닿는 shape가 같아야 합니다.
  • 내적(dot product)은 떨어져 있는 shape가 결과 행렬이 된다.

2-1. 연산자

소스코드

a = np.array([[1,2,3],
              [2,3,4]])
b = np.array([[3,4,5],
              [1,2,3]])

# shape가 같다라는걸 확인하기 ~
a.shape, b.shape


# 덧셈 연산
a + b

# 뺄셈 연산
a - b

# 곱셈 연산
a * b

# 나눗셈 연산.
a / b

결과


소스코드

# dot product (행렬곱, 내적)
a = np.array([[1,2,3],
              [1,2,3],
              [2,3,4]])
b = np.array([[1,2],
              [3,4],
              [5,6]])
              
a.shape, b.shape

# dot product (행렬곱, 내적) 손으로 계산한거. 
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6))

np.dot(a, b)

결과

2-2. arange

소스코드

# 파이썬에 제공되는 기능 (1~11전까지 숫자를 생성해주세요~)
arr1 = range(1, 11)

arr1

for i in arr1:
    print (i, end=' ')
    
arr2 = np.arange(1, 11)
arr2

for i in arr2:
    print (i, end=' ')

결과

2-3. sort

  • list안에 있는걸 정렬

소스코드

ndarr1 = np.array([1,10,5,7,2,4,3,6,8,9])
ndarr1

#오름차순 정렬

np.sort(ndarr1)

# 인플레이스 연산이 되어 있지 않기 때문에 정렬한게 다시 돌아온다.

ndarr1

결과


소스코드 (내림 차순이 되지 않는 에러코드)

np.sort(ndarr1, reverse=True) # 내림차순을 못한다! reverse속성이 존재 하지 않음.

결과


소스코드(내림 차순 코드)

# 내림차순을 하기 위해서는 다른 방법을 사용해야한다. 
# 문자열 역순으로 출력하기. 

str1 = 'Python'

print(str1[:])      #모든 문자를 슬라이싱
print(str1[::])     #print(str1[::1]) -> 1: 정방향
print(str1[::-1])   #print(str1[::-1]) -> -1: 역방향
print(str1[4:1:-1]) #4부터 1이되기직전까지 역방향으로 찍어라.
print(str1[4::-1])  #4부터 0까지 역방향으로 찍어라.

# 역방향으로 찍어주기 ([::-1]를 사용하여 내림차순정렬 해주기)
np.sort(ndarr1)[::-1]

결과


형열 정렬) 소스코드

ndarr2d = np.array([[11,10,12,9],
                    [3,1,4,2],
                    [5,6,7,8]])
ndarr2d.shape

# 행 정렬
# axis = 0 :행정렬

np.sort(ndarr2d, axis=0)

# 열 정렬
# axis = 1 :열정렬

np.sort(ndarr2d, axis=1)

# 열 정렬 내림차순

np.sort(ndarr2d, axis=1)[:,::-1]

# 축의 마지막 방향 

np.sort(ndarr2d, axis=-1)

결과


2-4. 숫자의 단일 연산

소스코드

a = np.array([[1,2,3],
              [4,5,6]])
              

a + 3
a - 3 
a * 3 
a / 3

# 위에서 3을 더하고, 빼고, 곱하고, 나눈것은 b행렬에 3이 모두 들어있는것과 같다.
b = np.array([[3,3,3],
              [3,3,3]])
a + b

결과

728x90

댓글