<출처 및 참고> https://datascienceschool.net/view-notebook/416d733c3a734565b69fd0c8dc959edb/ 


Numpy(넘파이)란 무엇일까?


Numpy는 파이썬의 수치해석용 라이브러리입니다.


실직적으로 다차원 행렬 자료구조인 ndarray를 핵심으로 선형대수 연산이 필요한 알고리듬에 사용됩니다..




ndarray 클래스


ndarray는 Numpy의 핵심인 다차원 행렬 자료구조 클래스 입니다.

실제로 파이썬이 제공하는 List 자료형과 동일한 출력 형태를 갖습니다.


ndarray는 다음과 같이 선언해 볼 수 있습니다.


import numpy as np   #numpy는 기니까 np로 줄여서 사용
a = np.array([0,1,2,3,4,5,6,7,8,9])
b = np.array([0.12 , 0.34, 0.45, 0.66])
c = np.array(['a' , 'b' , 'c'])
print(type(a))

print(type(a))의 결과는 <class 'numpy.ndarray'> 로 나오는 것을 확인 할 수 있습니다.


print(a)의 결과는 일반 파이썬 리스트와 동일합니다.


  • Python 리스트

    • 여러가지 타입의 원소
    • linked List 구현
    • 메모리 용량이 크고 속도가 느림
    • 벡터화 연산 불가
  • NumPy ndarray

    • 동일 타입의 원소
    • contiguous memory layout
    • 메모리 최적화, 계산 속도 향상
    • 벡터화 연산 가능

 출처 : https://datascienceschool.net/view-notebook/416d733c3a734565b69fd0c8dc959edb/ 



여기서 한가지 의문이 생깁니다.


우리는 파이썬의 List로도 다차원 행렬을 구현할 수 있고, 


List의 여러 함수를 사용하여 행렬 연산을 구현할 수 있습니다.


그렇다면 왜 Numpy의 ndarray를 사용하는 것일까요?


Numpy만의 선형대수 연산이 일반 파이썬의 List 보다 선형대수에 유리한 점이 많기 때문일 것입니다.


그렇다면 ndarray의 장점에는 어떤것이 있을까요?



ndarray 구현방식


ndarray는 일반 파이썬 List의 구현방식(Linked List)와 다르게 C의 배열(array)의 특성인

연속적인 메모리에 배치된다는 점입니다.


이로 인해 C의 array가 가지는 장점은 살리면서 파이썬의 직관적인 코딩도 가능하게 됩니다.


인접한 메모리 배치는 다수의 선형대수 연산의 속도를 향상시킬 수 있습니다.


그래서 전문가들의 python 성능 향상을 위한 코딩 관례중 python에서 ndarray의 벡터화 연산으로


계산할 수 있는 경우의 파이썬 내장 반복문은 사용하지 않는다는 점이라고 합니다.


 

ndarray 활용하기


ndim , shpae


ndarray 의 기본메소드중 ndim 과 shape는 머신러닝의 텐서 구조와 차원을 알아내는 것과 동일합니다.


print(a.ndim)
print(a.shape)
 1
(10,)


다차원 행렬 인덱싱 및 슬라이싱


ndarray는 일반 파이썬 list에는 없는 콤마(,)사용 인덱싱, 슬라이싱이 가능합니다.

a = np.array([[0, 1, 2], [3, 4, 5]])
a[0,0]  # first row , first col
a[0,1]  # first row , second col
a[-1,-1] # last row , last col

위 코드처럼 인덱싱이 가능하며

a = np.array([[0, 1, 2, 3], [4, 5, 6, 7]])
a[0,:]  # first row(전체)
a[:,1]  # second col (전체)
a[1,1:] # second row의 second col 부터 끝까지
a[:,0:3] #모든 row의 0:3까지 col

위코드 처럼 슬라이싱이 가능한 것을 볼 수 있습니다..


행렬 인덱싱


ndarray의 꽃(?) 이라고도 말할 수 있는 이 강력한 기능은 Fancy Indexing이라고도 불린다고 합니다.


데이터 베이스의 Query 기능을 수행하는 기능이기도 합니다.


Boolean 방식과 정수(인덱스) 행렬 방식 두가지가 존재합니다.


  • 불리안(Boolean) 방식 행렬 인덱싱

    • True인 원소만 선택
    • 인덱스의 크기가 행렬의 크기와 같아야 한다.
  • 정수 인덱스 방식 행렬 인덱싱

    • 지정된 위치의 원소만 선택
    • 인덱스의 크기가 행렬의 크기와 달라도 된다.

 출처 : https://datascienceschool.net/view-notebook/416d733c3a734565b69fd0c8dc959edb/ 


불리안 방식 행렬 인덱싱

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
idx = np.array([True, False, True, False, True, False, True, False, True, False])
print(a[idx])
[0 2 4 6 8]

위와 같이 True인 인덱스의 값을 가지는 행렬로 출력되는 것을 볼 수 있습니다.


정수 방식 행렬 인덱싱

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) * 10
idx = np.array([0, 2, 4, 6, 8])
print(a[idx])
[0 20 40 60 80]

이번에는 idx 어레이(ndarray)의 정수값인 0, 2, 4, 6, 8 번째 인덱스의 값을 가지는 


행렬로 출력되는 것을 볼 수 있습니다.



정수 방식 행렬 인덱싱은 중복되는 인덱스를 넣어 출력하는 것도 가능합니다.

a = np.array([0, 1, 2, 3]) * 10
idx = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2])
print(a[idx])
[0 0 0 0 0 0 10 10 10 10 10 20 20 20 20 20]

결과는 위와같이 출력됩니다. ( 총 행렬의 길이가 늘어났습니다. )



지금까지 Numpy라이브러리와 그 핵심 클래스인 ndarray에 대해 알아보았습니다. ㅎㅎ



+ Recent posts