-
NumPy 한번에 끝내기 03 - 데이터 과학 핵심 도구 (배열 변환/연산)빅데이터/NumPy 2022. 1. 18. 18:48
유투버 '이수안 컴퓨터 연구소'님 강의 참조
01 배열 변환
- 배열 전치 및 축 변경
print(a2) print(a2.T) #.T - 배열 전치 변경 print() print(a3) print(a3.T) [[1 2 3] [4 5 6] [7 8 9]] [[1 4 7] [2 5 8] [3 6 9]] [[[ 1 2 3] [ 4 5 6] [ 7 8 9]] [[10 11 12] [13 14 15] [16 17 18]] [[19 20 21] [22 23 24] [25 26 27]]] [[[ 1 10 19] [ 4 13 22] [ 7 16 25]] [[ 2 11 20] [ 5 14 23] [ 8 17 26]] [[ 3 12 21] [ 6 15 24] [ 9 18 27]]] print(a2) print(a2.swapaxes(1,0)) # .swapaxes - 축 변경 print() print(a3) print(a3.swapaxes(1,2)) [[1 2 3] [4 5 6] [7 8 9]] [[1 4 7] [2 5 8] [3 6 9]] [[[ 1 2 3] [ 4 5 6] [ 7 8 9]] [[10 11 12] [13 14 15] [16 17 18]] [[19 20 21] [22 23 24] [25 26 27]]] [[[ 1 4 7] [ 2 5 8] [ 3 6 9]] [[10 13 16] [11 14 17] [12 15 18]] [[19 22 25] [20 23 26] [21 24 27]]]
- 배열 재 구조화
# reshape() : 배열의 형상을 변경 n1 = np.arange(1, 10) print(n1) print(n1.reshape(3, 3)) [1 2 3 4 5 6 7 8 9] [[1 2 3] [4 5 6] [7 8 9]] # newaxis() : 새로운 축 추가 print(n1) print(n1[np.newaxis, :5]) #row print(n1[:5, np.newaxis]) #col [1 2 3 4 5 6 7 8 9] [[1 2 3 4 5]] [[1] [2] [3] [4] [5]]
- 배열 크기 변경
# 배열 모양만 변경 - 배열 크기가 증가 하지만 남은 공간은 0으로 채워 짐 n2 = np.random.randint(0, 10, (2, 5)) print(n2) n2.resize((5,2)) print(n2) [[5 0 7 9 1] [6 2 0 6 6]] [[5 0] [7 9] [1 6] [2 0] [6 6]] n2.resize((5,5)) print(n2) n2.resize((3,3)) print(n2) [[5 0 7 9 1] [6 2 0 6 6] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[5 0 7] [9 1 6] [2 0 6]]
- 배열 추가
# append() : 배열의 끝에 값 추가, axis값을 지정을 하지 않으면 1차원 배열 형태로 변형되어 결합 a2 = np.arange(1, 10).reshape(3,3) print(a2) b2 = np.arange(10, 19).reshape(3,3) print(b2) [[1 2 3] [4 5 6] [7 8 9]] [[10 11 12] [13 14 15] [16 17 18]] c2 = np.append(a2, b2) print(c2) c2 = np.append(a2, b2, axis = 0) #axis 값 지정시 0은 세로 1은 가로 print(c2) c2 = np.append(a2, b2, axis = 1) print(c2) [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12] [13 14 15] [16 17 18]] [[ 1 2 3 10 11 12] [ 4 5 6 13 14 15] [ 7 8 9 16 17 18]]
- 배열 연결
# concatenate() : 튜플이나 배열의 리스트를 인수로 사용해 배열 연결 a1 = np.array([1, 3, 5]) b1 = np.array([2, 4, 6]) np.concatenate([a1, b1]) array([1, 3, 5, 2, 4, 6]) c1 = np.array([7,8,9]) np.concatenate([a1, b1, c1]) array([1, 3, 5, 2, 4, 6, 7, 8, 9]) a2 = np.array([[1,2,3],[4,5,6]]) np.concatenate([a2, a2]) array([[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]) a2 = np.array([[1,2,3],[4,5,6]]) np.concatenate([a2, a2], axis = 1) array([[1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6]]) # vstack() - 수직 스택, 1차원으로 연결 np.vstack([a2, a2]) array([[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]) # hstack() - 수평 스택 - 2차원으로 연결 np.hstack([a2, a2]) array([[1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6]]) # dstack() - 깊이 스택 - 3차원으로 연결 np.dstack([a2, a2]) array([[[1, 1], [2, 2], [3, 3]], [[4, 4], [5, 5], [6, 6]]]) # stack() - 새로운 차원으로 연결 np.stack([a2, a2]) array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
- 배열 분할
# split() : 배열을 분할함 a1 = np.arange(0, 10) print(a1) b1, c1 = np.split(a1, [5]) #.splic(분할 배열, 자르는 기준 값) print(b1, c1) b1, c1, d1, e1, f1 = np.split(a1, [2,4,6,8]) print(b1, c1, d1, e1, f1) [0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4] [5 6 7 8 9] [0 1] [2 3] [4 5] [6 7] [8 9] # vsplit() - 수직 분할, 1차원 / hsplit() - 수평 분할, 2차원 / dsplit() - 깊이 분할, 3차원 a2 = np.arange(1,10).reshape(3, 3) print(a2) b2, c2 = np.vsplit(a2, [2]) print(b2) print(c2) [[1 2 3] [4 5 6] [7 8 9]] [[1 2 3] [4 5 6]] [[7 8 9]] a2 = np.arange(1,10).reshape(3, 3) print(a2) b2, c2 = np.hsplit(a2, [2]) print(b2) print(c2) [[1 2 3] [4 5 6] [7 8 9]] [[1 2] [4 5] [7 8]] [[3] [6] [9]] a2 = np.arange(1,28).reshape(3, 3, 3) print(a2) b2, c2 = np.dsplit(a2, [2]) print(b2) print(c2) [[[ 1 2 3] [ 4 5 6] [ 7 8 9]] [[10 11 12] [13 14 15] [16 17 18]] [[19 20 21] [22 23 24] [25 26 27]]] [[[ 1 2] [ 4 5] [ 7 8]] [[10 11] [13 14] [16 17]] [[19 20] [22 23] [25 26]]] [[[ 3] [ 6] [ 9]] [[12] [15] [18]] [[21] [24] [27]]]
02 배열 연산
- NumPy의 배열 연산은 벡터화(vectorized) 연산을 사용 → 보통의 프로그래밍 언어에서 배열 연산은 배열 형태의 엘리먼트들을 반복문을 통해 꺼내서 각각 연산을 시키는게 기본 이다. 하지만 'NumPy'가 지원하는 벡터화는 반복문없이 벡터의 같은 인덱스에 위차한 원소들끼리 연산 수행이 가능하게 해준다.
- 반복을 최소화하고 범용 함수를 통해 구현이 된다.
- 넘파이의 배열 연산에서는 '브로드 캐스팅' 이라는 개념을 알아야 한다.
배열에서 단순 +5를 하게되면 나머지 배열 부분의 'shape'이 연산하고자 하는 값이 저절로 맞춰지게 되는 것. 즉 사진에서 보는것처럼 자동적으로 캐스팅이 된다는 것.
a1 = np.array([1,2,3]) print(a1) print(a1 + 5) [1 2 3] [6 7 8] a2 = np.arange(1, 10).reshape(3,3) print(a2) print(a1 + a2) [[1 2 3] [4 5 6] [7 8 9]] [[ 2 4 6] [ 5 7 9] [ 8 10 12]]
- 산술 연산
범용함수를 쓰거나 연산자를 바로 써도 상관이 없다 a1 = np.arange(1, 10) print(a1) print(a1 + 1) print(np.add(a1, 10)) print(np.subtract(a1, 2)) print(np.multiply(a1, 3)) print(np.divide(a1,2)) print(np.power(a1, 2)) print(np.mod(a1, 2)) [1 2 3 4 5 6 7 8 9] [ 2 3 4 5 6 7 8 9 10] [11 12 13 14 15 16 17 18 19] [-1 0 1 2 3 4 5 6 7] [ 3 6 9 12 15 18 21 24 27] [0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5] [ 1 4 9 16 25 36 49 64 81] [1 0 1 0 1 0 1 0 1]
▶ 차원에 관계없이 연산자/범용함수가 모두 적용이 가능 하다
- 절대값/제곱-제곱근/지수와 로그/삼각 함수
# 절대값 - absolute/abs a1 = np.random.randint(-10, 10, size=5) print(a1) print(np.absolute(a1)) print(np.abs(a1)) [ 6 -6 -2 3 -10] [ 6 6 2 3 10] [ 6 6 2 3 10] # 제곱 square/sqrt print(a1) print(np.square(a1)) print(np.sqrt(a1)) [ 6 -6 -2 3 -10] [ 36 36 4 9 100] [2.44948974 nan nan 1.73205081 nan] # 지수/로그 a1 = np.random.randint(1, 10, size=5) print(np.exp(a1)) print(np.exp2(a1)) print(np.a1,2) print(a1) print(np.log(a1)) #log2, log10 등 조절 가능
- 삼각 함수
# 삼각함수 t = np.linspace(0, np.pi, 3) #.linspace(시작값, 끝값, 개수) - 균등하게 배분 print(t) print(np.sin(t)) print(np.cos(t)) print(np.tan(t)) [0. 1.57079633 3.14159265] [0.0000000e+00 1.0000000e+00 1.2246468e-16] [ 1.000000e+00 6.123234e-17 -1.000000e+00] [ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]
'빅데이터 > NumPy' 카테고리의 다른 글
NumPy 한번에 끝내기 04 - 데이터 과학 핵심 도구 (연산 함수/정렬/입출력) (0) 2022.01.18 NumPy 한번에 끝내기 02 - 데이터 과학 핵심 도구 (배열 조회/인덱싱/삽입/수정/삭제/복사) (0) 2022.01.18 NumPy 한번에 끝내기 01 - 데이터 과학 핵심 도구 (배열 생성) (0) 2022.01.17