본문 바로가기

Study/AI

넘파이(Numpy) - 배열 객체 다루기

728x90

넘파이란?

  • 파이썬의 고성능 과학 계산용 라이브러리
  • 벡터나 행렬 같은 선형대수의 표현법을 코드로 처리
  • 사실상의 표준 라이브러리
  • 다차원 리스트나 크기가 큰 데이터 처리에 유리

넘파이의 특징

  • 속도가 빠르고 메모리 사용이 효율적
  • 반복문을 사용하지 않음
  • 다양한 선형대수 관련 함수 제공
  • C, C++, 포트란 등 다른 언어와 통합 사용 가능
  •  

넘파이 배열 객체

np.array함수를 사용하여 배열 생성

import numpy as np
test_array = np.array([1, 4, 5, 8], float)
  • 매개변수 1: 배열 정보
  • 매개변수 2: 넘파이 배열로 표현하려는 데이터 타입

파이썬 리스트와 넘파이 배열의 차이점

  • 텐서 구조에 따라 배열 생성
  • 동적 타이핑 지원 안함
  • 데이터를 메모리에 연속적으로 나열

배열의 생성

In
test_array = np.array([145"8"], float)
print(test_array)
Out [1. 4. 5. 8.]

 

- 배열을 실수형으로 선언

- 배열을 출력해보면 값이 모두 실수형

 

In
print(test_array.dtype)
Out float64
In
print(test_array.shape)
Out (4, )

 

 

- dtype는 넘파이 배열의 데이터 타입을 반환

- shape는 넘파이 배열에서 객체(object)의 차원(dimension)에 대한 구성 정보를 반환

 

1. shape

 

In
matrix = [[1,2,5,8], [1,2,5,8],[1,2,5,8]]
np.array(matrix, int).shape
Out
(3, 4)

In
tensor_rank3 = [
[[1258], [1258], [1258]],
[[1258], [1258], [1258]],
[[1258], [1258], [1258]],
[[1258], [1258], [1258]]
]
np.array(tensor_rank3, int).shape
Out
(4, 3, 4)
 

2. dtype

In
np.array([[1,2,3.5], [4,5,6.5]], dtype=int)
Out
 
array([[1, 2, 3],
          [4, 5, 6]])

매개변수 dtype으로 넘파이 배열의 데이터 타입 지정

In
np.array([[1,2,3.5], [4,5,6.5]], dtype=float)
Out
 
array([[1. , 2. , 3.5],
           [4. , 5. , 6.5]])

- dtype를 실수형인 float로 지정한다면 모든 데이터가 실수형으로 저장되는 것을 확인 가능

In
import sys
np.array([[1,2,3.5], [4,5,6.5]], dtype=np.float64).itemsize
Out
8
In
np.array([[1,2,3.5], [4,5,6.5]], dtype=np.float32).itemsize
Out
4

- itemsize 요소로 넘파이 배열에서 각 요소가 차이하는 바이트(byte) 확인

- np.float64로 dtype를 선언하면 64비트, 즉 8바이트 차지

- np.float32로 dtype를 선언하면 32비트, 즉 4바이트 차지

배열의 구조 다루기

In
x = np.array([[1,2,5,8], [1,2,5,8]])
x.shape
Out
(2, 4)
In
x.reshape(-1,)
Out
array([1, 2, 5, 8, 1, 2, 5, 8])

- reshape함수로 배열의 구조를 변경하고 랭크 조절.

- 반드시 전체 요소의 개수는 통일해야한다.

- -1사용 시 나머지 차원의 크기를 지정했을 때 전체요소의 개수를 고려하여 마지막 차원이 자동으로 지정됨

In
x = np.array(range(8)).reshape(222)
x
Out
array([[[0, 1],
           [2, 3]],

           [[4, 5],
            [6, 7]]])
In
x.flatten()
Out array([0, 1, 2, 3, 4, 5, 6, 7])

- flatten함수는 데이터 그대로 1차원으로 변경

데이터의 개수는 그대로 존재. 배열의 구조만 변한다.

 

인덱싱과 슬라이싱

1. 인덱싱

인덱싱: 리스트에 있는 값의 상대적인 주소(offset)로 값에 접근

넘파이 배열의 인덱스 표현에는 ','를 지원

 -'[행][열]' 또는 '[행, 열]'의 형태

3차원 텐서 이상은 shape에서 출력되는 랭크 순서대로 인덱싱에 접근

In
x = np.array([[1,2,3], [4,5,6]],int)
x
Out
array([[1, 2, 3],
           [4, 5, 6]])
In
x[0][0]
Out 1
In x[0, 2]
Out 3
In x[0, 1] = 100
x
Out array([[ 1, 100, 3],
          [ 4, 5, 6]])

2. 슬라이싱

슬라이싱: 인덱스를 사용하여 리스트 일부를 잘라내어 반환

넘파이 배열은 행과 열을 나눠 슬라이싱 할 수 있다.

In
x = np.array([[12345], [678910]], int)
x[:,2:]
Out
array([[ 3, 4, 5],
          [ 8, 9, 10]])

- x는 2행 5열인 행렬

- x[:,2:]는 행 부분은 행 전체, 열 부분은 인덱스가 2 이후의 값

In
x[11:3]
Out
array([7, 8])

- x[1, 1:3]은 행 부분은 첫 번째 행만을 의미

- 열 부분 1:3은 열이 1부터 2까지의 값을 추출

In
x[1:3]
Out array([[ 6, 7, 8, 9, 10]])

- 행렬 전체의 행의 개수가 2 이기 때문에 이를 넘어가는 인덱스는 무시

 

증가값(step): 리스트에서 데이터의 요소를 호출할 때 데이터를 건너뛰면서 반환

'[시작 인덱스:마지막 인덱스:증가값]'의 형태

각 랭크에 있는 요소별로 모두 적용할 수 있다.

In
x = np.array(range(15), int).reshape(3-1)
x
Out array([[ 0, 1, 2, 3, 4],
          [ 5, 6, 7, 8, 9],
          [10, 11, 12, 13, 14]])
In
x[:,::2]
Out array([[ 0, 2, 4],
           [ 5, 7, 9],
           [10, 12, 14]])
In
x[::2,::3]
Out array([[ 0, 3],
          [10, 13]])

배열 생성 함수

1. range

 - range함수와 같이 차례대로 값을 생성

 - '(시작 인덱스, 마지막 인덱스, 증가값)'으로 구성

 - range함수와 달리 증가값에 실수형이 입력되어도 값을 생성할 수 있음

 - 소수점 값을 주기적으로 생성할 때 유용

In
np.arange(10)
Out array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In
np.arange(-55)
Out array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4])
In
np.arange(050.5)
Out array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])

2. ones, zeros, empty

 - ones 함수: 1로만 구성된 넘파이 배열을 생성

 - zeros 함수: 0으로만 구성된 넘파이 배열을 생성

 - empty 함수: 활용 가능한 메모리 공간 확보하여 반환

ones와 zero는 먼저 shape의 크기만큼 메모리를 할당하고 그곳에 값을 채움

해당 메모리 공간에 값이 남았을 경우 그 값을 함꼐 반환

 - 생성 시점에서 dtype를 지정해주면 해당 데이터 타입으로 배열 생성

In
np.ones(shape=(52), dtype=np.int8)
Out array([[1, 1],
           [1, 1],
           [1, 1],
           [1, 1],
           [1, 1]], dtype=int8)
In
np.zeros(shape=(2,2), dtype=np.float32)
Out array([[0., 0.],
           [0., 0.]], dtype=float32)
In
np.empty(shape=(2,4), dtype=np.float32)
Out array([[0. , 1.875 , 0. , 2.25 ],
           [0. , 2.3125, 0. , 2.5 ]], dtype=float32)

3. ones_like, zeros_like, empty_like

 - ones_like 함수: 기존 넘파이 배열과 같은 크기로 만들어 내용을 1로 채움

 - zeros_like 함수: 기존 넘파이 배열과 같은 크기로 만들어 내용을 0으로 채움

 - empty_like 함수: 기존 넘파이 배열과 같은 크기로 만들어 빈 상태로 만듦

In
x = np.arange(12).reshape(3,4)
x
Out array([[ 0, 1, 2, 3],
           [ 4, 5, 6, 7],
           [ 8, 9, 10, 11]])
In
np.ones_like(x)
Out array([[1, 1, 1, 1],
           [1, 1, 1, 1],
           [1, 1, 1, 1]])
In
np.zeros_like(x)
Out array([[0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0]])

4. identity, eye, diag

 - identity 함수: 단위행렬(i 행렬)을 생성

매개변수n으로 n x n 단위행렬을 생성

In
np.identity(n=3, dtype=int)
Out array([[1, 0, 0],
           [0, 1, 0],
           [0, 0, 1]])
In
np.identity(n=4, dtype=int)
Out array([[1, 0, 0, 0],
           [0, 1, 0, 0],
           [0, 0, 1, 0],
           [0, 0, 0, 1]])

 - eye 함수: 시작점과 행렬 크기를 지정, 단위행렬 생성

N은 행의 개수, M은 열의 개수를 지정

k는 열의 값을 기준으로 시작 인덱스

In
np.eye(N=3, M=5)
Out array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.]])
In
np.eye(N=3, M=5, k=2)
Out array([[0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.]])

 - diag 함수: 행렬의 대각성분 값을 추출

In
matrix = np.arange(9).reshape(3,3) matrix
Out array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
In
np.diag(matrix)
Out array([0, 4, 8])
In np.diag(matrix, k=1)
Out array([1, 5])

통계 분석 함수

- uniform 함수: 균등분포 함수

'np.random.uniform(시작값, 끝값, 데이터개수)'

In
np.random.uniform(0, 5, 10
Out array([3.87101195, 0.12263269, 0.80780157, 0.65361498, 0.55792293, 3.64577442, 0.93322468, 3.1913397, 1.82159678, 3.64401469])

- normal 함수: 정규분포 함수

'np.random.normal(평균값, 분산, 데이터개수)'

In
np.random.normal(0, 2, 10)
Out array([ 4.92446265, -2.4753182 , -2.12734589, -2.75839296, -0.22365806, -0.93325909, 1.81593553, 1.74506567, 2.20788194, 1.42156357])

 

728x90

'Study > AI' 카테고리의 다른 글

Titanic Survival Prediction  (1) 2024.04.10
넘파이(Numpy) - 비교 연산과 데이터 추출  (0) 2023.04.09
넘파이(Numpy) - 배열 연산  (0) 2023.04.09
데이터의 이해  (0) 2023.04.02
머신러닝의 기초  (0) 2023.04.02