별의 공부 블로그 🧑🏻‍💻
728x90
728x170

넘파이 배열

넘파이 모듈 임포트

import numpy as np

 

넘파이 배열 생성

  • 넘파이에서는 벡터(Vector) 매트릭스(Matrics) 배열(Array)이라고 한다.
    • 벡터(Vector)의 의미
      • 수학, 물리학
        •   크기와 방향을 가지는 기하학적 양 또는 객체
      • 넘파이
        • 1차원 배열
        • 2차원 이상의 배열을 매트릭스라고 한다. 

 

배열을 생성하는 방법

  • 리스트(List), 튜플(Tuple) 등 다른 파이썬 자료 구조에서 변환
  • arange(), ones(), zeros(), linspace() 등 넘파이 고유의 배열 생성 함수 사용
  • 저장 디스크에서 배열을 읽어들임.
  • 문자열이나 버퍼를 통한 바이트 스트림 데이터 Raw Bytes 에서 배열 생성
  • random() 함수와 같은 특수한 라이브러리 함수 사용

 

 

 

넘파이에서의 배열

  • 넘파이에서 제공되는 새로운 데이터 타입 배열 리스트와 유사하다.
    • 그러나 리스트 같은 타입의 요소만 가질 수 있는 반면, 배열 다른 타입이나 객체도 요소로 가질 수 있다.
    • 이런 점에서 배열은 요소를 연산하고 저장하기에 더 효율적이다.
  • 논리적이고 통계적인 연산 푸리에 변환 같은 연산을 매우 효율적으로 처리할 수 있다.
  • 파이썬의 리스트보다 많은 데이터를 처리할 수 있다.
  • 리스트에서 사용할 수 없는 기능이나 방법들을 다양한 라이브러리를 이용해 처리할 수 있다.
  • 머신러닝에서 사용되는 주요 데이터 구조이다.

 

파이썬 유사 배열 객체를 넘파이 배열로 변환

  • 파이썬
    • 배열 데이터 구조가 없으며, 리스트를 이용해 유사 배열(Array-Like)을 만든다.
  • 넘파이
    • numpy.array() 함수를 이용해 리스트 배열을 생성하고, 효율적으로 연산할 수 있다.
  • numpy.array() 함수에서 매개 변수로 입력되는 리스트 배열 유사 배열이라고 한다.
    • 유사 배열인 리스트 데이터를 입력해 처리한 결과가 넘파이 배열이 되며, 이 배열은 ndarray 객체이다.
      • 파이썬의 데이터 타입인 리스트 데이터를 입력하여 넘파이 배열을 생성하는 형태
arr = numpy.array([유사 배열])

 

1차원 배열 생성

리스트(List) 형태로 출력하기
arr1 = np.array([0, 2, 5.5, 7])
print(arr1)    # List 형태로 출력
더보기
[0.  2.  5.5 7. ]
  • print() 함수를 사용하여 넘파이 배열을 출력할 경우, 리스트(List) 형태로 출력이 된다.

 

 

배열(Array) 형태로 출력하기
arr1 = np.array([0, 2, 5.5, 7])
arr1    # Array 형태로 출력
더보기
array([0. , 2. , 5.5, 7. ])
  • 넘파이 배열 직접 출력할 경우, 배열(Array) 형태로 출력이 된다.

 

 

2차원 배열 생성

arr2 = np.array([[1, 2, 3], [4, 5, 6]])
arr2
더보기
array([[1, 2, 3],
       [4, 5, 6]])

 

 

  • 넘파이 배열은 같은 타입의 값들을 포함하는 그리드(Grid) 형태를 띄며, 타입은 ndarray 객체이다.
    • N Dimensional Array
  • ndarray의 특성은 메모리 주소, 데이터 타입, shape  strides 의 조합이다.

 

넘파이 고유의 배열 생성 함수

  • 넘파이는 배열을 생성하는 고유한 내장 함수들을 포함한다.

 

① numpy.zeros()

  • 값이 0으로 채워지는 배열을 생성

 

arr = np.zeros(5)
arr
더보기
array([0., 0., 0., 0., 0.])
  • 요소가 0이면서 5개인 배열 객체가 생성된다.

 

type(arr)     # 타입 출력
더보기
numpy.ndarray
  • 생성된 배열 객체가 ndarray 타입의 객체임을 확인할 수 있다.

 

arr.shape    # 차원 출력
더보기
(5,)
  • 1차원 배열로, 요소 5개라는 의미
    • (1, 5) 와 같은 의미
  • 참고
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]])
arr.shape
(5, 3)

 

# 3차원 배열
arr = np.array([[[1, 2, 3], [4, 5, 6]],
                [[7, 8, 9], [10, 11, 12]],
                [[13, 14, 15], [16, 17, 18]]
               ]) 
arr.shape
(3, 2, 3)

 

 

arr = np.zeros(shape=(6, 2))    # 6행 2열의 배열 생성
for i in range(6):
    arr[i] = (i, i)
arr
더보기
array([[0., 0.],
       [1., 1.],
       [2., 2.],
       [3., 3.],
       [4., 4.],
       [5., 5.]])
  • 매개변수 shape 에는 튜플형인 정수를 입력할 수 있다.

 

 

② numpy.ones()

  • 값이 1로 채워지는 배열을 생성
  • 매개변수 shape 에는 튜플형인 정수를 입력할 수 있다.

 

np.ones(5)    # 요소값이 1이고, 5개인 1차원 배열 생성
더보기
array([1., 1., 1., 1., 1.])
  • 요소가 1이면서 5개인 1차원 배열 객체가 생성된다.

 

 

np.ones((5,), dtype=int)
더보기
array([1, 1, 1, 1, 1])
  • 요소가 1이면서 5개인 1차원 배열 객체가 생성된다.
    • 각 요소의 자료형은 정수형(int)이다.

 

 

np.ones((3, 4))    # 요소값이 1이고, 3행 4열인 2차원 배열 생성
더보기
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

 

 

arr.dtype    # 배열의 자료형 출력
더보기
dtype('float64')

 

③ numpy.empty()

  • 초기화되지 않은 임의의 값들로 배열을 생성
  • 초기화 함수 중 가장 빠르게 처리된다.

 

 

 

np.empty((2, 2))
더보기
array([[1.33042158e-311, 1.33040420e-311 ],
       [0.00000000e+000, 1.06099790e-314]])

 

np.empty((2, 2), dtype=int)
더보기
array([[   7929940,    6619248],
       [-130307808,        626]])

 

④ numpy.eye()

  • 대각선에는 값 1, 그 밖의 위치에 값 0을 가지는 n × n 배열을 생성하는 함수
    • 정방 행렬(단위 행렬)을 출력해주는 함수
    • $\begin{bmatrix} 1 & 0  \\ 0 & 1 \end{bmatrix}$
  • 실행 결과는 2차원 배열이다.
  • n(정수)를 입력값으로 가지며. n열 n행인 배열 객체를 생성한다.

 

np.eye(3, dtype=int)
더보기
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

 

 

np.eye(3, k=1)
더보기
array([[0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.]])
  • 대각선을 기준으로, 1단계 위로 1이 배치된다.
  • k에 -2를 입력하면 대각선 기준 2단계 아래로 1이 배치된다는 의미이다.

 

⑤ numpy.linspace()

  • 명시된 간격으로 균등하게 분할된 값을 반환하는 함수

 

np.linspace(2.0, 3.0, num=5)
더보기
array([2.  , 2.25, 2.5 , 2.75, 3.  ])
  • 2.0과 3.0 사이에 5개의 수들을 균등하게 생성

 

 

np.linspace(2.0, 3.0, num=5, endpoint=False)
더보기
array([2. , 2.2, 2.4, 2.6, 2.8])
  • 2.0과 3.0 사이에 5개의 수들을 균등하게 생성, 하지만 끝점은 포함하지 않음.

 

배열 생성 함수 numpy.arange()

  • 배열을 생성하는 arange() 함수에는 [시작, 끝) 인 범위값을 입력한다.
    • 시작값은 포함하고, 끝값은 포함하지 않는다.
numpy.arange(시작값, 끝값, [증분값])

 

arr = np.arange(5)
arr
더보기
array([0, 1, 2, 3, 4])

 

 

np.arange(3, 7)
더보기
array([3, 4, 5, 6])

 

 

arr.shape
더보기
(5,)

 

 

np.arange(3, 9, 2)    # 증분 : 2
더보기
array([3, 5, 7])

 

 

arr[2] = 10
arr
더보기
array([ 0,  1, 10,  3,  4])
  • 넘파이 배열 값을 변경할 때는 먼저 값을 초기화한 후 변경해야 한다.

 

 

arr[3] = 'jin'
더보기
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_22576/2453786679.py in <module>
----> 1 arr[3] = 'jin'

ValueError: invalid literal for int() with base 10: 'jin'
  • 넘파이 배열은 동종 배열(Homogeneous Array)이기 때문에 자료형이 다른 요소들을 한 배열에 넣을 수 없다.

 

 

  • arange() 함수를 사용하면 1차원 배열만 생성하지만, reshape() 함수를 함께 사용하면 2차원 배열을 생성할 수 있다.
    • reshape() 함수는 데이터를 변경하지 않고, 배열을 새로운 shape 로 변형시킨다.

 

arr = np.arange(12).reshape(3, 4)
arr
더보기
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
  • arange() 함수로 12개의 요소를 1차원으로 생성한 배열을 reshape() 함수로 3행, 4열인 2차원 배열로 변경한다.
  • 생성된 배열 arr의 타입은 ndarray 객체이다.

 

 

arr.shape
더보기
(3, 4)
  • 배열 arr이 (3, 4) shape  튜플형임을 확인할 수 있다.

 

 

  • reshape() 함수의 매개 변수 -1을 입력할 경우, 다차원 배열을 1차원 배열로 변경하여 반환한다.
    • ravel() 함수와 같다.
      • 다차원 배열을 1차원 배열로 정렬하는 함수
      • numpy.ndarray.ravel  numpy.ravel 2종류의 객체가 있다.

 

arr.reshape(-1)

 

더보기
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

 

  • ravel() 함수를 사용한 것과 결과값이 같다.
arr.ravel()

 

 

arr.reshape(-1, 1)
더보기
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
  • -1 , 1 을 의미한다.
  • arr 배열인 12개 값으로 은 -1로 알 수 없고, 1열인 배열을 생성하라는 의미이다.

 

 

arr.reshape(3, -1)
더보기
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
  • 3 , -1 을 의미한다.
  • arr 배열인 12개 값으로 은 -1로 알 수 없고, 3행인 배열을 생성하라는 의미이다.

 

 

arr.reshape(-1, -1)
더보기
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: can only specify one unknown dimension
  • (-1, -1)을 입력하면 오류가 발생한다.

 

 

  • 3차원 배열을 생성하기 위해서는 reshape() 함수에 매개 변수 3개가 필요하다.
arr = np.arange(24).reshape(2, 3, 4)
arr
더보기
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
  • 2 면(Depth), 3 , 4 을 의미한다.
  • 2 × 3 × 4 = 24

 

 

디스크에서 읽어서 배열 생성

  • 커다란 배열을 생성하는 일반적인 방법
  • 디스크에 있는 데이터 타입에 크게 의존한다.
  • HDF5, FITS, CSV 파일 등을 라이브러리를 이용하여 읽어들일 수 있다.

 

 

넘파이 ndarray 클래스

  • 넘파이는 2개의 주요 객체인 다차원 배열 객체 ndarray 유니버셜 함수 객체 ufunc를 지원한다.
  • 그리고 이 두 객체를 중심으로 관련된 다른 객체들로 구성된다.
  • 배열 타입인 ndarray 같은 타입의 요소들을 모아 놓은 다차원 객체이다.
    • 정수 인덱스를 통해 ndarray 안에 있는 요소들에 접근할 수 있다.

 

arr = np.array([[0, 1, 2],
                [3, 4, 5]])
type(arr)
더보기
<class 'numpy.ndarray'>

 

 

arr.shape
더보기
(2, 3)

 

 

arr.dtype
더보기
dtype('int32')

 

 

ndarray 객체 구조

  • ndarray 클래스 같은 타입과 크기인 요소를 담고 있는 다차원 컨테이너이다.
  • 배열의 shape와 배열이 구성되는 요소 타입(dtype)으로 ndarray 객체를 정의한다.
    • shape
      • 각 차원에서 N 정수의 튜플형
      • 인덱스가 얼마나 변하는지에 대한 정보 제공
    • 요소의 타입
      • 데이터 타입 객체인 dtype 속성으로 확인할 수 있다.
  • ndarray 클래스는 같은 데이터 타입의 요소를 모아 놓은 곳이므로, 모든 요소는 같은 크기 메모리 블록을 가지며 인터프리터가 배열의 메모리 블록을 동일한 방법으로 처리한다.

ndaray의 데이터 타입(Type)과 그 타입의 배열 요소에 접근하여 연산할 때 반환되는 Array, Scalar 파이썬 객체의 관계

  • dtype은 array, scalar 타입 객체를 가리키고, 데이터 타입 객체와 ndarray의 관련 요소를 사용한 배열 스칼라가 반환된다.

 

  • ndarray는 인접하는 블록의 C(행) 우선 또는 F(열) 우선 형태로 부호화되어 저장된다.
    • 이러한 데이터 처리 방식은 C 언어 포트란(Fortran) 데이터 실행 방식에서 유래한 것이다.
      • C 우선 : C 언어
      • F 우선 : 포트란

 

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

             [[12, 13, 14, 15],
              [16, 17, 18, 19],
              [20, 21, 22, 23]]])
arr
더보기
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

 

arr.ndim        # 차원 확인
더보기
3
  • 대괄호([ ]) 3겹으로 쌓여 있으므로 3차원이라고 생각할 수 있다.

 

 

arr.size        # 전체 요소의 개수 반환
더보기
24
  • 4 × 6 = 24

 

 

arr.shape
더보기
(2, 3, 4)

 

 

arr.dtype
더보기
dtype('int32')

 

 

arr.itemsize
더보기
4
  • arr 배열의 크기는 4바이트이다.
    • 1바이트는 8비트이므로, arr 배열 요소의 크기는 32비트(4×8), 즉 int32 이다.

 

 

arr.strides    # 배열의 요소 크기와 배치 확인
더보기
(48, 16, 4)
  • 에서 다음 로 이동하려면 4바이트, 에서 다음 으로 이동하려면 16(4×4)바이트, 그리고 에서 다음 으로 이동하려면 48(16×3)바이트가 필요함을 알 수 있다.

 

 

넘파이 배열의 데이터 타입

  • 넘파이 배열은 데이터 타입 객체로 생성하는 모든 요소를 포함하며, 이때 요소의 데이터 타입은 동일하다.

 

numpy.dtype 적용

  • numpy.dtype 클래스의 인스턴스인 데이터 타입 객체는 고정 크기인 메모리 블록에서 바이트가 어떻게 해석되는지에 따라 다음과 같은 사항들을 나타낸다.
    • 데이터 타입(정수, 실수, 파이썬 객체 등) 및 크기
    • 메모리에 저장된 데이터의 바이트 순서
      • LSB(Least Significant Bit)
        • Little-Endian 이라고 불림.
        • 가장 낮은 위치인 가장 오른쪽에 위치하는 비트
      • MSB(Most Significant Bit)
        • Big-Endian 이라고 불림.
        • 가장 높은 위치인 가장 왼쪽에 위치하는 비트
      •   
        MSB             LSB
    • 아래를 포함하는 구조화된 데이터라면 배열 요소의 데이터 타입에 대해 다음 사항을 입력
      • 구조화된 데이터의 필드 이름(이 이름으로 필드에 접근)
      • 각 필드의 데이터 타입
      • 각 필드가 위치하는 메모리 블록의 어느 부분
    • 데이터 타입이 서브 배열인 경우, 그 shape와 데이터 타입
  • numpy.dtype 클래스는 스칼라 배열 요소를 반환한다.
    • 이러한 배열 스칼라는 파이썬 스칼라와 다르지만, 대부분 서로 호환하여 사용할 수 있다.
    • 배열 스칼라는 ndarrays 객체와 같은 속성과 메서드를 갖지만, 요소를 변경할 수 없는(immutable) 특징이 있어 어떤 속성도 설정할 수 없다.
  • 넘파이는 스칼라 데이터의 타입을 설명하기 위해 다양한 정밀도의 정수, 실수 등이 내장된 몇몇 스칼라형을 제공한다.
넘파이의 배열 스칼라형 파이썬의 관련된 타입
Int_ IntType (파이썬2)
float_ FloatType
complex_ ComplexType
bytes_ BytesType
unicode_ UnicodeType

 

  • numpy.dtypes 클래스는 np.float32, np.int_, np.uint16, np.bool_ 등의 타입으로 이루어진다.
    • 이 데이터 타입은 수치를 배열 스칼라로 변환하는 함수로써 사용할 수 있고, dtype 키워드의 인수로 사용할 수도 있다.
>>> a = np.float32(5.0)
>>> a
5.0

>>> type(a)
<class 'numpy.float32'>

>>> b = np.int_([1, 2, 3])
>>> b
array([1, 2, 3])

>>> type(b)
<class 'numpy.ndarray'>

>>> c = np.arange(5, dtype=np.uint16)
>>> c
array([0, 1, 2, 3, 4], dtype=uint16)

>>> type(c)
<class 'numpy.ndarray'>

 

  • 배열 데이터 타입 객체의 체계

https://docs.scipy.org/doc/numpy-1.3.x/reference/arrays.scalars.html

 

  • 배열 데이터 타입 분류
타입 구분 자 코드 주요 내용
불리언 bool_ '?' 파이썬 bool과 호환
bool8   8비트
정수 byte 'b' C 언어 char와 호환
short 'h' C 언어 short와 호환
intc 'i' C 언어 int와 호환
Int_ 'l' 파이썬 int와 호환
longlong 'q' C 언어 long long과 호환
intp 'p' signed 타입의 포인터와 같은 크기의 정수형
int8   8비트, $-2^{7} \sim (2^{7}-1)$
int16   16비트, $-2^{15} \sim (2^{15}-1)$
int32   32비트, $-2^{31} \sim (2^{31}-1)$
int64   64비트, $-2^{63} \sim (2^{63}-1)$
Unsigned Integers ubyte 'B' C 언어 unsigned char와 호환
ushort 'H' C 언어 unsigned short와 호환
uintc 'I' C 언어 unsigned int와 호환
uint 'L' 파이썬 int와 호환
ulonglong 'Q' C 언어 long long과 호환
uintp 'P' unsigned 타입의 포인터와 같은 크기의 정수형
uint8   8비트, $0 \sim (2^{8}-1)$
uint16   16비트, $0 \sim (2^{16}-1)$
uint32   32비트, $0 \sim (2^{32}-1)$
uint64   64비트, $0 \sim (2^{64}-1)$
실수 half 'e' -
single 'f' C 언어 float와 호환
double   C 언어 double과 호환
float_ 'd' 파이썬 float와 호환
longfloat 'g' C 언어 long float와 호환
float16   16비트
float32   32비트
float64   64비트
float96   96비트, 운용 체계 및 언어에 따라 호환되지 않을 수 있음.
float128   128비트, 운용 체계 및 언어에 따라 호환되지 않을 수 있음.
복소수 csingle 'F' -
complex_ 'D' 파이썬 complex와 호환
clongfloat 'G' -
complex64   2개의 32비트 실수
complex128   2개의 64비트 실수
complex192   2개의 96비트 실수
complex256   2개의 128비트 실수, 언어에 따라 호환되지 않을 수 있음.
파이썬 객체 object_ 'O' 데이터는 파이썬 객체를 참조
기타 bytes_ 'S#' 파이썬 bytes와 호환
unicode_ 'U#' 파이썬 unicode/str과 호환
void 'V#' -
  • 인덱싱으로 추출한 배열의 요소는 배열 데이터 타입과 관련된 파이썬 객체인 스칼라형이다.
  • 어떤 데이터 타입을 생성하면 구조화된 데이터 타입이 형성된다.
    • 이때 생성된 데이터 타입의 필드는 다른 데이터 타입을 포함하여 계층 구조를 형성한다.
      • 각 필드는 이름을 가지고 있으며, 이 이름을 이용해 필드에 접근할 수 있다.
    • 부모 격 데이터 타입은 계흥화된 모든 필드를 포함할 정도로 충부한 크기여야 한다.
      • 또한, 부모 격 데이터의 기본 타입은 임의의 배열 요소 크기를 허용하는 void 타입이다.
    • 구조화된 데이터 타입의 필드 안에는 구조화된 서브배열 데이터 타입들도 포함될 수 있다.

 

  • Big-Endian의 32비트의 정수를 가지는 데이터 타입
>>> dt = np.dtype('>i4')
>>> dt.byteorder
'>'

>>> dt.name
'int32'

>>> dt.itemsize
4

>>> dt.type is np.int32
True

 

  • 16문자 string을 포함하는 구조화 데이터 타입과 2개의 64비트 서브 배열(sub_array)
    • 데이터 순서를 LSB인 최소 유효 바이트로 처리했다는 뜻이다.
>>> dt = np.dtype([('name', np.unicode_, 16), ('grades', np.float64, (2,))])
>>> dt['name']
dtype('<U16')

>>> dt['grades']
dtype(('<f8', (2,)))

 

 

728x90
그리드형(광고전용)

'In-depth Study > NumPy' 카테고리의 다른 글

[NumPy] 넘파이 적용  (0) 2022.04.14
[NumPy] 배열 객체 관리와 연산  (0) 2022.04.13
[NumPy] 구조화된 배열  (0) 2022.04.13
[NumPy] 넘파이(NumPy) 개요  (0) 2022.04.13
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖