오답노트

[Numpy] Numpy 소개와 N차원 배열 본문

Python/Numpy

[Numpy] Numpy 소개와 N차원 배열

권멋져 2022. 7. 7. 16:41

Numpy

오픈소스 파이썬 라이브러리로 내부적으로 C언어로 구현되어 있어서, 다차원 배열을 적은 메모리와 빠른 연산 속도로 처리할 수 있다.

 

N 차원 배열

2-1. 왼쪽부터 순서대로 1차원, 2차원, 3차원 배열

axis 는 축을 의미하며 차원이 증가할 수 록 axis의 개수도 증가한다.

 

1차원 배열

axis 가 1개인 배열

 

2차원 배열

axis 가 2개인 배열

axis 0은 행, axis 1은 열

우리가 알고있는 행렬의 형태이다.

 

3차원 배열

axis 가 3개인 배열

axis 0은 행, axis 1은 열, axis 2는 깊이

3차원 배열 이상의 배열들을 텐서(Tensor)라고 부른다.

 

코드로 구현하기

array 함수

array 함수는 직접 배열을 입력하거나, 리스트, 튜플같은 자료형을 입력하여 배열로 만들 수 있다.

이 때, 리스트와 배열이 비슷하게 생겼다.

하지만 자료형을 확인하면 전혀 다른 결과를 확인할 수 있다.

import numpy as np

# numpy로 배열 만들기
arr = np.array([1,2,3])
print(arr)

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

#numpy의 배열과 리스트의 자료형 차이
print(type([1,2,3]))
print(type(arr))

#튜플 -> 배열
tpl = (4,5,6)
arr3 = np.array(tpl)
print(arr3)

#리스트 -> 배열
lst = [1,2,3]
arr_list = np.array(lst)
print(arr_list)

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

3.1-1. 위 코드블록에 대한 출력

shape, ndim, size 

shape 은 배열의 각 axis의 크기를 의미한다.

ndim 은 배열의 차원을 의미한다.

size 는 배열의 총 크기(shape 의 곱)을 의미한다.

 

import numpy as np

# 배열의 형태
arr1 = np.array([1,2,3])
arr2 = np.array([[1,2,3],[4,5,6]])

print(arr1.shape,arr2.shape)

# 차원
print(arr1.ndim,arr2.ndim)

# 크기
print(arr1.size, arr2.size)

3.2-1 위 코드블록에 대한 출력

데이터 타입과 형변환

배열의 데이터 타입은 배열은 만들 때, 원소의 자료형으로 결정된다.

하지만 dtype 옵션으로 원소의 자료형과 상관없이 사용자가 원하는 자료형으로 배열을 만들 수 있다.

혹은 astype 함수를 통해 이미 선언되어 있는 배열의 자료형을 변환할 수 있다.

 

또, 파이썬의 리스트 같은 경우는 원소들의 데이터 타입이 혼재가 가능했다. 예를 들어 리스트가 문자열, 정수, 실수를 모두 동시에 원소로 가질 수 있었다.

 

하지만 배열의 원소들은 한 개의 데이터 타입으로 통일된다.

 

마지막 코드라인의 문자열이 포함된 배열의 자료형 변환 같은 경우를 조심하도록 하자.

 

import numpy as np

# 정수 원소 -> 실수
arr = np.array([1,2,3], dtype = np.float)
print(arr, arr.dtype)

# 실수 원소 -> 정수
arr = np.array([1.1,2.2,3.3], dtype = np.int)
print(arr, arr.dtype)

# 정수 원소 -> boolean
arr = np.array([0, 1, 1], dtype = np.bool)
print(arr, arr.dtype)

# 정수 타입의 배열 선언
arr = np.array([0, 1, 2, 3])
print(arr, arr.dtype)

# 정수 타입의 배열 -> 실수 타입의 배열
arr = arr.astype(np.float32)
print(arr, arr.dtype)

# 데이터 타입이 혼재
arr = np.array([0, 1, 2, 3.3, "test"])
print(arr, arr.dtype)

arr = np.array([0, 1, 2, 3.3, "55"], dtype = int)
print(arr, arr.dtype)

# !! 오류 발생 !!
arr = np.array([0, 1, 2, 3.3, "test"], dtype = int)
print(arr, arr.dtype)

3.3-1. 위 코드블록에 대한 출력
3.3-2. 오류발생 주석 코드라인에 대한 오류