[03. 패키지 - NumPy] (1) 다차원 배열(np.array), (2) 인덱싱(:)과 합치기(np.concatenate)
작성자 : kim2kie
(2023-02-19)
조회수 : 1716
[참조]
- 공학자를 위한 Python, 조정래, 2022: 3. NumPy
https://wikidocs.net/14569 - Dookie Kim, Python: From Beginning to Application, 2022
https://www.dropbox.com/s/oa86j9ap62esmtz/Python.pdf?dl=0
NumPy는 과학 컴퓨팅을 위한 기본 패키지이다.
다차원 배열 외에도 이산 푸리에 변환, 선형대수, 통계, 난수(random number) 등 다양한 기능을 가지고 있다.
(1) 다차원 배열(n-dimensional array; ndarray)
1) 배열(array) 생성
2) 초기화(initialization)
3) 배열 덧붙이기(append)
4) 범위 지정: range()/np.arange()/np.linspace()
5) shape의 변경 → reshape(), dtype의 변경 → astype()
(2) 인덱싱(indexing)과 합치기
1) 인덱스 배열
2) 불린(boolean) 배열
3) 합치기
(1) 다차원 배열
1) 배열(array) 생성
- list나 tuple 같은 시퀀스 자료형으로 부터 생성한다.
-
Ex)
import numpy as npX = np.array([0.1, 0.2, 0.3]) # X는 float64(64비트 실수)를 요소로 갖는 크기 3의 1차원 배열
X.shape # 배열의 형태 (3,); 요소 개수가 3인 1차원 배열
X.dtype # 요소의 데이터 타입, int32, float32 등; dtype('float64')
X.ndim # 차원수; 1
X.size # 요소의 개수; 3
X.itemsize # 요소의 데이터 타입 크기(byte 단위); 8Y = np.array([[1,2,3], [4,5,6]]) # Y는 int32(32비트 정수)을 요소 타입으로 하는 (2,3) 크기의 2차원 배열
(Note: 행을 바꿀 때, comma(,)를 사용한다)
Y.shape # 배열의 형태 (2,3); 2행 3열
Y.dtype # 요소의 데이터 타입, int32, float32 등; dtype('int32')
Y.ndim # 차원수; 2
X.size # 요소의 개수; 6
X.itemsize # 요소의 데이터 타입 크기(byte 단위); 4 -
Q) X 배열의 행과 열의 개수를 알고 싶다.
A) X.shape[0], X.shape[1] -
Q) M = np.array([[1]])와 M = np.array([1])는 어떻게 다를까?
M = np.array([1])는 1D array이고
M = np.array([[1]])는 2D array이다. -
비교: size, ndim, shape
In[]: XT.size
Out[]: 8061
In[]: XT.ndim
Out[]: 2
In[]: XT.shape
Out[]: (2687, 3)
2) 초기화(initialization)
-
Ex)
import numpy as npY = np.zeros([3,3]) # 모든 요소를 실수 0.으로 초기화한 3x3 배열 생성
Y = np.ones([3,3]) # 모든 요소를 실수 1.으로 초기화한 3x3 배열 생성
Y = np.ones([3,3],dtype='int32') # 정수형 배열을 생성할 때는 dtype을 int32로 변경
Z = np.empty([3,3]) # 모든 요소를 초기화 하지 않고 3x3 배열 생성
S = np.zeros_like(SD, dtype=complex) # Initialize complex arrays S like SD -
Q) np.zeros([3,1])와 np.zeros(3) 는 어떻게 다를까?
np.zeros([3,1]는 [[0.], [0.], [0.]]로 3x1인 2D array이며,
np.zeros(3)은 [0. 0. 0.]로 3개 요소를 갖는 (행과 열이 구분이 없는) 1D array이다.
참고로 1D array a는 transpose(a) - a는 np.zeros(len(a))와 같다. -
Q) Udw = np.zeros_like(Hw) 는?
Hw의 size와 type을 갖는 영(0) array인 Udw를 생성한다.
3) 배열 덧붙이기(append)
-
Ex)
import numpy as npA = np.array([]) # 요소가 없는 1차원 (실수) 배열 생성
for i in range(3): # [0,1,2] 생성
A = np.append(A,([1,2]) # [1,2]을 3번에 걸쳐 A에 더하여 [1.,2., 1.,2., 1.,2.] 배열 생성
4) 범위 지정: range()/np.arange()/np.linspace()
- range() 대신 np.arange(from,to,step) 또는 np.linspace(from,to,npoints) 사용
-
Ex)
import numpy as npnp.arange(1,1.5,0.1) # array([ 1. , 1.1, 1.2, 1.3, 1.4]) 생성
np.arange(3) # start = 0(default), step = 1(default); array([0, 1, 2])
np.arange(3.) # start = 0.(default), step = 1.(default); array([0., 1., 2.])
np.linspace(0.,20.,5) # 0에서 20까지 5개 점을 생성; array([ 0., 5., 10., 15., 20.])
np.eye(3) # 대각요소가 1.인 3x3 단위행렬(identity) 생성 -
Q) 디버깅: np.arrange(30,15,-1)
A) np.arrange(30,15,-1) -> np.arange(30,15,-1)
array + range -> a range
5) shape의 변경 → reshape(), dtype의 변경 → astype()
-
Ex)
import numpy as npX = np.arange(0,9,1.) # array([0., 1., 2., 3., 4., 5., 6., 7., 8.])
Y = X.reshape([3,3]) # 3x3 배열로 형태 변경
# array([ [ 0., 1., 2.], [ 3., 4., 5.], [ 6., 7., 8.] ])A = np.arange(3) # array([0, 1, 2])
A.astype(int) # A의 요소 dtype을 정수으로 변경
A.astype(float) # A의 요소 dtype을 실수으로 변경 -
Q) reshape(-1, 정수) 의 행(row) 위치에 '-1'이 들어있을 경우
A) 열의 개수에 따라 행의 개수가 가변적으로 정해진다.
12개의 요소를 가진 x의 경우,
x.reshape(-1, 1) = shape(12,1)
x.reshape(-1, 2) = shape(6, 2)
x.reshape(-1, 3) = shape(4, 3)
x.reshape(-1, 4) = shape(3, 4) -
Q) "M = np.array([1])"를 Column 벡터인 2D array로 어떻게 전환할까?
A) "M2d = M.reshap(-1,1)" -
Q) 1차원 배열을 2차원 배열로 만들기
L =np.array([1,2,3,4,5]) #(5,)
L15 = L[np.newaxis,:] #(1,5)
L51 = L[:,np.newaxis] #(5,1)
(2) 인덱싱(indexing)과 합치기
1) 인덱스 배열
-
Ex)
import numpy as npA = np.array([1.2, -1.3, 2.2, 5.3, 3.7])
A[0] # 첫 번째 요소; 1.2
A[0:3] # 첫 번째부터 (3-1)번째 요소; array([ 1.2, -1.3, 2.2])
A[-1] # 맨 마지막 요소; 3.7
A[-2] # 맨 마지막에서 두 번째 요소; 5.3
A[0:-1] # 첫 번째부터 (마지막번째 - 1)번째 요소; array([ 1.2, -1.3, 2.2, 5.3])idx = [0,3]
A[idx] # 첫 번째와 네 번째 요소 배열; array([ 1.2, 5.3]) -
Q) 배열의 시작 index는?
Python과 C는 0부터 시작하고,
Matalab과 Fortran은 1부터 시작한다. -
축소행렬
Dr = D[0:nmode] # Reduced D
Vr = V[:,0:nmode] # Reduced V
2) 불린(boolean) 배열
-
Ex)
import numpy as npX = np.array([1.2, -1.3, 2.2, 5.3, 3.7])
X > 2 # 불린 배열 생성; array([False, False, True, True, True])
idx = X > 2 # 불린 배열 생성; array([False, False, True, True, True])
X[idx] # X>2인 요소로 구성된 배열; array([2.2, 5.3, 3.7])
X[X > 2] # X>2인 요소로 구성된 배열; array([2.2, 5.3, 3.7])
np.nonzero(X) # 0이 아닌 요소의 인덱스 배열; (array([0, 1, 3, 5, 6], dtype=int64),)
np.nonzero(X>2) # 2보다 큰 요소의 인덱스 배열; (array([2, 3, 4], dtype=int64),)
3) 합치기
-
Ex)
import numpy as npA = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6]])
np.concatenate((A, B), axis=0) # axis방향(0: 수직, 1: 수평)으로 행렬을 합침
# array([ [1, 2], [3, 4], [5, 6] ])
np.concatenate((A, B.T), axis=1) # B를 전치(transpose)한 이후에 수평으로 합침
# array([ [1, 2, 5], [3, 4, 6] ])Ex) 2차원일 경우 np.vstack()과 np.hstack()이 편리
A = np.array([1,2,3])
B = np.array([4,5,6])
np.vstack((A,B)) # vertical 방향 합치기; array([ [1, 2, 3], [4, 5, 6] ])
np.hstack((A,B)) # horizontal 방향 합치기; array([1, 2, 3, 4, 5, 6])
C = np.append(A,B) # 배열 덧붙이기; array([1, 2, 3, 4, 5, 6])