Python

numpy 다루기 2

qlsenddl 2020. 10. 23. 14:05
728x90

 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@bnp.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]]

(세 가지 결과 모두 동일)

728x90

'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