Python/NumPy

[Numpy] ndarray

노트북 산 김에 공부 2023. 3. 10. 10:46

Numerical Python을 의미하는 넘파이는 파이썬에서 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 대표적인 패키지이다. 대량 데이터 기반의 과학과 공학 프로그램은 빠른 계산 능력이 매우 중요하므로 파이썬 기반의 많은 과학과 공학패키지는 넘파이에 의존하고 있다.

 

많은 머신러닝 알고리즘이 넘파이 기반으로 작성돼 있음은 물론이고 이들 알고리즘의 입력 데이터와 출력 데이터를 넘파이 배열 타입으로 사용하고 있다.
 

numpy를 사용하는 방법은 매우 간단하다. 'import numpy'로 라이브러리를 불러오고 'as np'로 코드를 쉽게 쓰도록 한다.

# 별칭(alias) 지정 (넘파이를 불러올 때 보통 np로 줄여서 표현한다.)
import numpy as np

ndarray 기본 

 

생성하기
# 1차원 
arr1 = np.array([1, 2, 3, 4)
                        # dtype으로 자료형을 지정 
arr1 = np.array([1, 2, 3], dtype=int)

# 2차원
arr2 = np.array([
		[1,2,3,4],
		[5,6,7,8]
               ])          
# 3차원
arr3 = np.array[[[1, 2, 5], [1, 2, 5]],
     	       [[1, 2, 5], [1, 2, 5]],
     	       [[1, 2, 5], [1, 2, 5]],
     	       [[1, 2, 5], [1, 2, 5]]]
# 변수로 만들기
data = [1,2,3,4]
arrVar = np.array(data)

np 를 호출하고 np.array( )에 괄호 안에 [ ] 같이 배열 형태의 데이터를 넣는다

 

Python 기본 배열과 차이점
# 1차원
myList = [1,2,3,4,5]
myArray = np.array([1,2,3,4,5])

# 2차원
myList2d = [[1,2,3],[4,5,6]]
myArray2d = np.array([[1,2,3],
	             [4,5,6]])

1. 출력 시 'array(데이터)' 형태로 나온다

 

myList2d[1][2]
myArray2d[1, 2]

2. 인덱싱 시 [ , ] 사용해  행 열 구분이 가능하다.

 

.shape - 배열 차원과 축을 알수 있다.

 

축(axis) : 값들의 나열 방향, 하나의 축은 하나의 범주이다.

차원(Dimension) : 축의 개수.

 

arr1D = [1,2,3,4]
arr2D = np.array([[1,2,3,4],
                  [5,6,7,8]])
print(arr1.shape)
print(arr2.shape)


인덱싱(Indexing)

 

 Fancy 인덱싱

 

fancy 인덱싱은 범위가 아닌 특정 index의 집합의 값을 선택하여 추출하고 싶을 때 활용합니다.

  • 1개의 데이터값을 선택하려면 ndarray객체에 해당하는 위치의 인덱스 값을 [ ]안에 입력한다.

 

1 차원

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[[4, 5, 6]] # []를 한번 더 쓰기

# 변수 지정 후 추출도 가능
idx=[4, 7, 9]
arr[idx]

2 차원

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

0부터 1번 인덱스까지의 행과 1과 3의 인덱스 열만 뽑아서 추출

 

Boolean 인덱싱
 
 
특정 조건에 해당하는지 여부인 True/False 값 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 있는 데이터의 ndarray를 반환한다.
arr = np.array([1, 2, 3, 4, 5, 6, 7])
myTrueFalse = [True, False, True, False, True, True, False]
arr[myTrueFalse]

 

조건필터
arr2d = np.array([[1, 2, 3, 4], 
                  [5, 6, 7, 8], 
                  [9, 10, 11, 12]])
# 5보다 큰 수
boo = arr2d > 5 
print(boo)
arr2d[boo]


편리하게 ndarray 생성

 

arange
arr = np.arange(1,11)
arr1 = np.arange(start=1, step=11) # keyword 지정 가능
arr2 = np.arange(1,11, 2) # 2씩 증가

 

 zeros, ones

 

인자로 튜플 형태의 shape 값을 입력하면 모든 값을 0, 1로 채운 해당 shape를 가진 ndarray를 반환

arr = np.zeros((3, 4), dtype='int32') # 데이터 타입 명시 가능
arr = np.ones((3,2))


정렬

.sort( ) 함수를 사용해 배열을 정렬시킬 수 있다. (axis 가 1이면 열기준 0이면 행기준 이다)

 

1차원 정렬
arr = np.array([1, 10, 5, 8, 2, 4, 3, 6, 7, 9])
np.sort(arr)
np.sort(arr)[::-1] # 인덱스 뒤부터

 

N차원 정렬
arr2d = np.array([[5, 6, 7, 8], 
                  [4, 3, 2, 1],
                  [10, 9, 12, 11]])
np.sort(arr2d, axis = 1) # 열 기준 정렬
np.sort(arr2d, axis = 0) # 행 기준 정렬

 

index 반환 정렬

정렬된 값을 반환하는 것이 아닌 index를 반환한다.

 

argsort

 

정렬된 값의 인덱스를 반환

arr2d = np.array([[5, 6, 7, 8], 
                  [4, 3, 2, 1],
                  [10, 9, 12, 11]])
np.argsort(arr2d) # 열 기준
np.argsort(arr2d, axis=0) # 행 기준


배열 합치기

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

b = np.array([4, 5, 6]) 으로 설명하겠습니다.

 

튜플로 인자 값을 넣어야 합니다. 함수( (x, y) )
column_stack( )

 

np.column_stack(): 1차원 배열을 수직 방향으로 쌓아 2차원 배열을 만들 수 있습니다. 또한, 2차원 배열의 경우 수평 방향으로 배열을 쌓을 수 있습니다.

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

d = np.array([[1, 2], [3, 4]])
e = np.array([[5, 6], [7, 8]])
f = np.column_stack((d, e))
print(f)

위와 같이 column_stack 함수는 두 배열의 각각 동일한 인덱스 끼리 stack 시킵니다.

 

concatenate(  )

 

np.concatenate(): 두 개 이상의 배열을 연결합니다. axis 매개변수를 사용하여 연결할 축을 지정할 수 있습니다. 예를 들어, axis=0이면 수직 방향으로, axis=1이면 수평 방향으로 연결합니다.

c = np.concatenate((a, b))
print(c)

 

vstack( ) , hstack( )

 

np.vstack(): 수직 방향으로 배열을 쌓습니다

np.hstack(): 수평 방향으로 배열을 쌓습니다.

v = np.vstack((a, b))
print(v)
h = np.hstack((a, b))
print(h)

 

반드시 합칠 배열을 함수( ) 안에 ( ) 로, 또 묶어서 넣어야 합니다.

선형대수 연산

 

행렬 내적 dot()

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

b = np.array([[7, 8],
              [9, 10],  
              [11, 12]])
np.dot(a, b)
np.dot(b, a)

 

전치 행렬 transpose()

 

2차원 배열에서 행과 열을 바꾸어준다.

a = np.array([[1, 2, 3], 
              [4, 5, 6]])
np.transpose(a)
# a.T 로도 가능 (https://smsai.tistory.com/)