numpy는 다차원 배열(즉, tensor)을 효율적으로 다루기 위한 python 패키지이다. python에 있는 list 자료형과 비슷하다고 생각할 수 있지만, numpy는 숫자 데이터로 이뤄진 배열에 특화되어있고, 그 값이 커질 수록 list보다 효율적으로(계산 시간 小) 데이터를 다룰 수 있어서 Data Science 분야에서 기본적으로 배운다.
4. indexing과 slicing
1) vector
a[ i ]: a라는 array의 i에 해당하는 요소(0부터 indexing)
a[ -i ]: a라는 array의 뒤에서 i번째 요소
a[ i : j ]: a라는 array의 i이상 j미만까지 array 접근(j에 해당하는 요소는 미포함)
a[ : j ]: a라는 array의 0부터 j미만까지 array 접근(j에 해당하는 요소는 미포함)
a[ i : ]: a라는 array의 i부터 끝까지 array 접근
a[ : ]: a라는 array의 처음부터 끝까지 array 접근(a 그 자체)
a[ i : j : k ]: a라는 array의 i이상 j미만까지 k 간격마다 indexing해서 array 접근
a[ i : j : -k ]: a라는 array의 i부터 j미만까지 k 간격마다 역순으로 indexing해서 array 접근 ( i > j )
ex>
a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(a[2]) # 2
print(a[-2]) # 8
print(a[2:5]) # [2 3 4]
print(a[:5]) # [0 1 2 3 4]
print(a[2:]) # [2 3 4 5 6 7 8 9]
print(a[:]) # [0 1 2 3 4 5 6 7 8 9]
print(a[2:8:2]) # [2 4 6]
print(a[8:2:-2]) # [8 6 4]
2) matrix
a[ i ][ j ]: a라는 array의 i에 해당하는 행, j에 해당하는 요소(0부터 indexing)
a[ i , j ]: a라는 array의 i에 해당하는 행, j에 해당하는 요소(0부터 indexing)
a[ i ], a[ i , : ]: a라는 array의 i에 해당하는 행
a[ : , j ]: a라는 array의 j에 해당하는 열
a[ -i ]: a라는 array의 뒤에서 i번째 행
a[ : , -j ]: a라는 array의 뒤에서 j번째 열
ex>
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print(a[1][0]) # 3
print(a[1, 0]) # 3
print(a[1]) # [3 4 5]
print(a[1, :]) # [3 4 5]
print(a[:,2]) # [2 5 8]
print(a[-1]) # [6 7 8]
print(a[:,-2]) # [1 4 7]
-> tensor도 같은 방식으로 확장 가능(a[ i , j , k ])
5. conditional indexing
1) numpy array a에 대해서 조건식을 쓰면 각 array 마다 해당 조건을 만족하는지에 대한 True False 값이 있는 array가 형성된다. 이를 이용해서 특정 조건을 만족하는 값들을 indexing 및 slicing을 할 수 있다.
ex>
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
idx = a%2 == 0
print(idx)
>> [[ True False True]
[False True False]
[ True False True]]
print(a[idx])
>> [0 2 4 6 8]
2) 특정 index 값을 넣어서 array를 indexing하는 것도 가능하다.
ex1>
a = np.array([1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9]) idx = [2, 5, 7] print(a[idx])
>> [1 4 6]
ex2>
a = np.array([[0, 1, 2, 3], [3, 4, 5, 6], [6, 7, 8, 9]]) print(a[:, [1, 3]])
>> [[1 3]
[4 6]
[7 9]]
3) tuple로 indexing하기
((a, b, c), (d, e, f)): [a, d], [b, e], [c, f]에 대해서 indexing
ex>
a = np.array([[0, 1, 2, 3], [3, 4, 5, 6], [6, 7, 8, 9]]) idx = ((0, 2, 1), (1, 3, 0)) print(a[idx])
>> [1 9 3]
6. operation
1) 사칙연산: numpy array에서 사칙연산은 element-wise 기반으로 연산(행렬 곱은 다르게 코딩해야)
ex>
a = np.array([[0, 1], [3, 4]]) b = np.array([[2, 2], [2, 2]]) print(a+b) >> [[2 3]
[5 6]]
print(a-b) >> [[-2 -1]
[ 1 2]]
print(a*b) >> [[0 2]
[6 8]]
print(a/b)
>> [[0. 0.5]
[1.5 2. ]]
2) 연산 관련 기본 내장 함수
sum(): 해당 array의 모든 요소 합
sum(axis = i): i에 해당하는 축에 대해서 요소 합(행렬의 경우 axis=0이면 같은 열끼리 합, axis=1이면 같은 행끼리 합)
mean(): 해당 array의 모든 요소에 대한 평균
mean(axis = i): i에 해당하는 축에 대해서 요소 평균
max(): 해당 array 요소 중 최대값
min(): 해당 array 요소 중 최소값
ex>
a = np.array([[0, 1], [3, 4]]) print(a.sum())
>> 8
print(a.sum(axis=1))
>> [1 7]
print(a.mean())
>> 2.0
print(a.mean(axis=1))
>> [0.5 3.5]
print(a.max())
>> 4
print(a.min())
>> 0
3) 내적, 행렬곱
np.dot(a,b): a와 b의 내적(a, b가 vector면 vector의 내적을 계산하고, matrix이면 행렬곱 계산)
a@b, np.matmul(a, b): a와 b의 행렬곱
주의 사항: np.dot과 @는 a, b가 행렬이면 결과가 동일하지만 3차원 tensor부터 결과가 다름 -> a@b의 결과가 일반적인 행렬곱이라고 이해
ex>
a = np.array([[0, 1], [3, 4]])
b = np.array([[1, 0], [0, 2]])
print(np.dot(a, b))
print(a@b)
print(np.matmul(a, b))
>> [[0 2]
[3 8]]
(세 가지 결과 모두 동일)
'Python' 카테고리의 다른 글
Pytorch의 tensor 다루기 (0) | 2020.11.07 |
---|---|
numpy 다루기 3 (0) | 2020.10.30 |
numpy 다루기 1 (0) | 2020.10.23 |
Python str 자료형(문자열) 멤버 함수 정리 (0) | 2020.10.22 |
Python list 자료형 멤버 함수 정리 (0) | 2020.10.22 |