[python] numpy

2021. 5. 3. 17:10Python/문법

Ver. Jupyter Notebook (Anaconda3)

▶ Numpy ndarray 개요

>>> import numpy as np

# ndarray 생성 np.array()
>>> list1 = [1, 2, 3]
>>> print("list1:", list1)
>>> print("list1 type:", type(list1))
list1: [1, 2, 3]
list1 type: <class 'list'>

>>> array1 = np. array(list1)
>>> print("array1:", array1)
>>> print("array1 type:", type(array1))
array1: [1 2 3]
array1 type: <class 'numpy.ndarray'>

# ndarray의 형태(shape)와 차원
## 1차원
>>> array1 = np.array([1,2,3])

## 2차원 ndarray
>>> array2 = np.array([[1,2,3],
>>>                               [2,3,4]])

## 2차원 ndarray(행이 1개만 있는 2차원) 
>>> array3 = np.array([[1,2,3]])

# ndaray 데이터 값 타입
>>> list1 = [1,2,3]
>>> array1 = np.array(list1)
>>> print(type(list1))
>>> print(type(array1))
>>> print(array1, array1.dtype)

<class 'list'>
<class 'numpy.ndarray'>
[1 2 3] int32

>>> list2 = [1, 2, 'test']
>>> array2 = nparray(list2)
>>> print(array2, array2..dtype)
['1' '2' 'test'] <U11

>>> list3 = [1, 2, 3.0]
>>> array3 = np.array(list3)
>>> print(array3, array3.dtype
[1. 2. 3.] float64

# astype()을 통한 타입 변환
>>> array_int = np.array([1, 2, 3])
>>> array_float = array_int.astype('float64')   # float32, float64, int32, int64

# ndarray에서 axis 기반의 연산함수 수행
>>> array2 = np.array([[1,2,3],
>>>                               [2,3,4]])

>>> print("전체 합: ", array2.sum())
>>> print("axis0 합: ", array2.sum(axis=0))   # row 합
>>> print("axis1 합: ", array2.sum(axis=1))   # colum 합
전체 합:  15
axis0 합:  [3 5 7]
axis1 합:  [6 9]

 

Numpy ndarray 생성, reshape()

# ndarray를 편리하게 생성하기 - arange, zeros, ones

>>> sequence_array = np.arange(10)
[0 1 2 3 4 5 6 7 8 9]

>>> zero_array = np.zeros((3,2))
[[0. 0.]
 [0. 0.]
 [0. 0.]]

>>> one_array = np.one((3,2), dtype='int32')
[[1 1]
 [1 1]
 [1 1]]

# ndarray의 shape를 변경하는 reshape() 
# reshape()에 -1 인자값을 부여하여 특정 차원으로 고정된 가변적인 ndarray형태 변환
>>> array1 = np.arange(10)
 [0 1 2 3 4 5 6 7 8 9]

>>> array2 = np.reshape(2,5)   #= np.reshape(-1,5)
 [[0 1 2 3 4]
 [5 6 7 8 9]]

>>> array3 = np.reshape(5,2#= np.reshape(5,-1)
 [[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]


>>> array1 = np.arange(5)
 [0 1 2 3 4]

1차원을 2차원으로 변환
>>> array2d_1 = array1.reshape(-1, 1)
 [[0]
 [1]
 [2]
 [3]
 [4]]

2차원을 1차원으로 변환
>>> array1d = array2d_1.reshape(-1, )
 [0 1 2 3 4]

 

▶ ndarray의 데이터 세트 선택하기 – 인덱싱(Indexing)

  ● 특정 위치의 단일값 추출

# n번 째 index 값
>>> array1 = np.arange(start=1, stop=10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> array1[2]
3
>>> array1[-2]
8

# 요소 수정
>>> array1[0] = 9
>>> array1[8] = 0
array([9 2 3 4 5 6 7 8 0])

>>> array1d = np.arange(start=1, stop=10)
>>> array2d = array1d.reshape(3, 3)
>>> print(array2d)
[[1 2 3]
 [4 5 6]
 [7 8 9]]

>>> array2d[0, 0]
1
>>> array2d[2, 1]
8

 

  ● 슬라이싱

연속적인 데이터 가져오기
# 1차원
>>> array1 = np.arange(start=1, stop=10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> array1[0:3]
array([1, 2, 3])
>>> array1[3:]
array([4 5 6 7 8 9])

# 2차원
>>> array2d = array1.reshape(3,3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> array2d[0:2, 0:2]
array([[1, 2],
       [4, 5]])
>>> array2d[1:3, 0:3]
array([[4, 5, 6],
       [7, 8, 9]])

 

  ● 팬시 인덱싱

# 비연속적인 데이터 가져오기
>>> array1 = np.arange(start=1, stop=10)
>>> array2d = array1.reshape(3,3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> array2d[[0, 1], 2]
array([3, 6])
>>> array2d[[0,2], 0:2]
array([[1, 2],
       [7, 8]])

>>> list(array2d)
[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]

>>> array2d.tolist()
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

 

  ● 불리언 인덱싱

# True, False로 데이터 가져오기
>>> array1d = np.arange(start=1, stop=10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> array1d > 5
array([False, False, False, False, False, True, True, True, True])

>>> array1d[array1d > 5]
array([6, 7, 8, 9])

 

▶ 행렬의 정렬 - sort()와 argsort()

  ● 1차원 행렬 정렬

>>> org_array = np.array([3, 1, 9, 5])
>>> org_array
array([3, 1, 9, 5])

# np.sort() : 객제 자체는 변경되지 않음
>>> sort_array1 = np.sort(org_array)
>>> org_array
array([3, 1, 9, 5])
>>> sort_array
array([1, 3, 5, 9])



# ndarray.sort() : 객체 자체를 변경
>>> sort_array2 = org_array.sort()
>>> org_array
array([1, 3, 5, 9])

>>> sort_array2
None
>>> sort_array2 = org_array
array([1, 3, 5, 9])

 

  ● 2차원 행렬 정렬

>>> array2d = np.array([[8, 12],
                                       [7, 1 ]])
>>> array2d
array([[ 8, 12],
          [ 7,  1]])

>>> sort_array2d_axis0 = np.sort(array2d, axis=0)
>>> sort_array2d_axis0
array([[ 7,  1],
          [ 8, 12]])
>>> sort_array2d_axis0 = np.sort(array2d, axis=1)
>>> sort_array2d_axis0
array([[ 8, 12],
          [ 1,  7]])

 

  ● argsort()

# sort의 인덱스 값을 가져오기
>>> org_array = np.array([ 3, 1, 9, 5]) 
>>> org_array
array([3, 1, 9, 5])

>>> sort_indices = np.argsort(org_array)
>>> sort_indices
array([1, 0, 3, 2], dtype=int32)

>>> sort_indices_desc = np.argsort(org_array)[::-1]
array([2, 3, 0, 1], dtype=int32)

>>> name_array = np.array(['John', 'Mike', 'Sarah', 'Kate', 'Samuel'])
>>> score_array = np.array([78, 95, 84, 98, 88])

>>> sort_indices = np.argsort(score_array)
>>> sort_indices
array([1, 0, 3, 2], dtype=int32)

>>> name_array_sort = name_array[sort_indices]
>>> score_array_sort = score_array[sort_indices]

>>> print(name_array_sort)
>>> print(score_array_sort)
['John' 'Sarah' 'Samuel' 'Mike' 'Kate']
[78 84 88 95 98]

 

▶ 선형대수 연산 - 행렬 내적과 전치 해열 구하기

  ● 내적 행렬

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

>>> B = np.array([[7, 8],
>>>                       [9, 10],
>>>                       [11, 12]])

>>> dot_product = np.dot(A, B)
>>> print('행렬 내적 결과:\n', dot_product)
행렬 내적 결과:
 [[ 58  64]
 [139 154]]

 

 ●  전치 행렬

>>> A = np.array([[1, 2],
>>>                        [3, 4]])

>>> transpose_mat = np.transpose(A)
>>> print('A의 전치 행렬:\n', transpose_mat)
A의 전치 행렬:
 [[1 3]
 [2 4]]