본문 바로가기
파이썬/Numpy(넘파이)

[NumPy] 1. 넘파이 개념, ndarray, 배열 생성

by 쿠킷리스트 2021. 10. 12.

학습내용


#1 : 넘파이(NumPy)란?

 넘파이는 Python에서 벡터, 행렬 등 수치 연산을 수행하는 선형대수(Linear algebra) 라이브러리이다. 선형대수 관련 수치 연산을 지원하고 내부적으로는 C로 구현되어 있어 연산이 빠른 속도로 수행되며, 메모리를 비교적 적게 사용한다. 또한 Scipy와 함께 사용하면 공학용 소프트웨어인 MATLAB에 버금가는 기능을 지원한다.

데이터로 표현되는 이미지

 머신러닝과 딥러닝을 구현하다 보면 1차원 벡터(vector) 또는 행렬(matrix) 계산을 해야 하는 경우가 많다. 위 그림과 같이 색(color)이 있으면 1을, 색이 없으면 0의 값을 가지는 흑백 이미지로 숫자 2를 나타내고 있다. 이처럼 2차원 이미지(image)는 행렬(matrix)로 표현할 수 있으며, 딥러닝으로 이미지(image) 인식을 하기 위해서는 행렬을 만들고 동시에 연산이 필요하며 이때 넘파이를 활용할 수 있다.

 

1) Numpy 패키지 추가하기

넘파이 라이브러리를 사용하기 위해서는 Numpy 패키지를 추가해야 하며, 패키지가 없는 경우 pip install numpy를 통해 패키지를 설치해야 한다. 코랩에는 설치가 되어있기에 추가만 하면 된다.

import numpy as np

 


#2 : ndarray

 넘파이에서 배열은 ndarray 또는 array라고 부른다. numpy.array는 표준 파이썬 라이브러리 클래스 array.array와 같지 않으며, 표준 라이브러리는 1차원 배열이며 기능이 더 적다.

numpy.ndarray의 대표적인 속성값
ndarray.shape 배열의 각 축(axis)의 크기
ndarray.ndim 축의 개수(Dimention)
ndarray.dtype 각 요소(Element)의 타입
ndarray.itemsize 각 요소(Element) 타입의 bytes 크기
ndarray.size 전체 요소(Element)의 개수

그림으로 표현한 ndarray

- .shape은 배열의 크기를 나타낸다. (3,5)는 3행 5열을 의미.

- .ndim은 차원을 나타내며 행, 열 2개가 있기에 2(차원).

- .dtype은 요소의 타입으로 int32이다. 이는 정수형이라는 점과 한 가지 타입으로 구성되어있다는 의미.

- .itemsize는 각 요소 타입의 bytes 크기로 4이다. 32비트 정수는 4 bytes.

- .size는 전체 요소의 개수로 ndarray에 15개의 요소가 담겨있기에 15.


1) ndarray 코드 돌려보기

1차원 배열을 .reshape(3,5) 을 사용해 3행, 5열 2차원 배열로 만들어 준다. 배열의 차원을 볼 때 시작할 때 혹은 끝날 때의 대괄호 [ ] 개수를 보면 차원을 파악하기 용이하다.

import numpy as np

a = np.arange(15)
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
a = np.arange(15).reshape(3,5)
print(a)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]

print(a.shape) #(3, 5)
print(a.ndim) #2
print(a.dtype) #int64
print(a.itemsize) #8
print(a.size) #15
print(type(a)) #<class 'numpy.ndarray'>

2) 배열 생성하기 - Array Creation

np.array( )를 이용하여 파이썬에서 사용하는 튜플(tuple)이나 리스트(list)를 입력으로 numpy.ndarray를 만들 수 있다. 리스트를 numpy.array로 바꿀 경우 메모리의 축소, 속도 증가 등의 효과를 얻을 수 있다. numpy.array( )의 괄호 안에 매개변수를 직접 입력하면 에러. 정수와 소수 모두 입력 가능.

a = np.array([1,2,3])
print(a)
#[1 2 3]
b = np.array((1,2,3))
print(b)
#[1 2 3]

c = np.array(1,2,3,4) #Error

2차원 배열이나 3차원 배열도 위와 동일한 방법으로 생성할 수 있다. 또한 numpy.array는 한 가지의 데이터 타입으로 모든 값을 저장한다. 아래 변수 c의 경우 모든 값을 소수형으로 저장하였다.

 

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

b = np.array(((1,2,3),(4,5,6)))
print(b)
#[[1 2 3]
# [4 5 6]]

c = np.array([[1.1,2.2],[3,4]])
print(c)
# [[1.1 2.2]
#  [3.  4. ]]

배열을 생성할 때, 배열의 타입을 지정할 수 있으며 아래는 dtype=complex를 이용하여 복소수 값, dtype=float을 이용하여 소수 값으로 지정.

a = np.array([[1,2],[3,4]], dtype=complex)
print(a)
# [[1.+0.j 2.+0.j]
#  [3.+0.j 4.+0.j]]
b = np.array([[1,2],[3,4]], dtype=float)
print(b)
# [[1. 2.]
#  [3. 4.]]

3) 배열을 생성하는 방법들

import numpy as np
np.zeros() 0으로 구성된 N차원 배열 생성
np.ones() 1으로 구성된 N차원 배열 생성
np.empty() 초기화되지 않은 N차원 배열 생성
#2차원
np.zeros((3,4))
# array([[0., 0., 0., 0.],
#        [0., 0., 0., 0.],
#        [0., 0., 0., 0.]])

#3차원
np.ones((2,3,4), dtype = np.int16)
# array([[[1, 1, 1, 1],
#         [1, 1, 1, 1],
#         [1, 1, 1, 1]],

#        [[1, 1, 1, 1],
#         [1, 1, 1, 1],
#         [1, 1, 1, 1]]], dtype=int16)

np.empty((2,3))
# array([[1.39069238e-309, 1.39069238e-309, 1.39069238e-309],
#        [1.39069238e-309, 1.39069238e-309, 1.39069238e-309]])
import numpy as np
np.arange() N만큼 차이나는 숫자 생성
np.linsapce() N등분한 숫자 생성
#10 부터 30 미만까지 5 간격으로
np.arange(10,30,5)
#array([10, 15, 20, 25])

#0 부터 2 미만까지 0.3 간격으로
np.arange(0,2,0.3)
#array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

#0부터 2사이에 있는 9개 숫자
np.linspace(0,2,9)
#array([0.  , 0.25, 0.5 , 0.75, 1.  , 1.25, 1.5 , 1.75, 2.  ])

- np.linspace()는 n 등분한 숫자를 생성하는 것으로 차트에 유용한 기능이다.

from numpy import pi #pi는 3.141592...
x = np.linspace(0, 2*pi, 50)
f = np.sin(x)
print(f)
# [ 0.00000000e+00  1.27877162e-01  2.53654584e-01  3.75267005e-01
#   4.90717552e-01  5.98110530e-01  6.95682551e-01  7.81831482e-01
#   8.55142763e-01  9.14412623e-01  9.58667853e-01  9.87181783e-01
#   9.99486216e-01  9.95379113e-01  9.74927912e-01  9.38468422e-01
#   8.86599306e-01  8.20172255e-01  7.40277997e-01  6.48228395e-01
#   5.45534901e-01  4.33883739e-01  3.15108218e-01  1.91158629e-01
#   6.40702200e-02 -6.40702200e-02 -1.91158629e-01 -3.15108218e-01
#  -4.33883739e-01 -5.45534901e-01 -6.48228395e-01 -7.40277997e-01
#  -8.20172255e-01 -8.86599306e-01 -9.38468422e-01 -9.74927912e-01
#  -9.95379113e-01 -9.99486216e-01 -9.87181783e-01 -9.58667853e-01
#  -9.14412623e-01 -8.55142763e-01 -7.81831482e-01 -6.95682551e-01
#  -5.98110530e-01 -4.90717552e-01 -3.75267005e-01 -2.53654584e-01
#  -1.27877162e-01 -2.44929360e-16]

- pi는 원주율.(3.141592...)

- x는 0부터 pi 값의 두배까지 50 분할한 값.

- f는 x 50분할 한 값을 sin값으로 매핑한 결과.

댓글