homogeneuos 유형의 데이터타입은 파이썬의 일반적인 sequence 타입보다 빠른 수학 연산이 가능하다. 특히 넘파이는 c 기반의 내부 구조를 가지고 있는 라이브러리이고 메모리 번지를 stride 하게 가져와 연산하기 때문에 빠르고 효율적이다.
넘파이의 array는 내부 구조만 놓고 보면 숫자의 연쇄이지만, 스칼라, 벡터, 매트릭스, 텐서 등 n차원의 수학적 컨셉을 표현할 수 있다. 따라서 많은 numeric task에 매우 유용하다.
만드는 법은 np.arange(), np.linspace, np.ones(), np.zeros(), np.empty등의 방법이 있다.
넘파이는 n차원의 수학적 컨셉을 표현하는데 사용하기 때문에 축 개념이 중요하다. 예를 들어 숫자 1은 0차원, [1,2,3] 구조는 1차원 벡터, [[1,2],[3,4]] 구조는 2차원 매트릭스가 된다. 이 축 개념은 인덱싱과 슬라이싱으로 이어진다. 즉 축을 이해해야 원하는 위치의 데이터를 가져올 수 있다.
인덱싱과 슬라이싱의 방법은 크게 5가지라고 할 수 있다.
이를 2차원 매트릭스에 적용해서 이해해 보았다.
a = np.arange(24).reshape(4,6)
# 방법 1.
a[0], a[0,5]
# 방법 2.
a[a>20]
# 방법 3.
a[[0,1]]
# 방법 4.
a[(0,1),(0,1)]
# 방법 5.
a[...]
각각의 결과는 어떨까?
1 : array([0,1,2,3,4,5]), 5
2 : array([21,22,23,24])
3 : array([[0,1,2,3,4,5],[6,7,8,9,10,11]])
4 : array([0,7])
5 : a 구조 그대로 리턴
파이썬에서도 copy는 혼동스러운 측면이 있다. 특히 mutable 타입과 관련해서 원치않는 결과를 낼 때도 있다. numpy의 array또한 mutable타입이기 때문에 이 copy에 주의할 필요가 있다. 이를 위해 shallow copy와 deep copy개념을 구분해야 한다. 먼저 shallow copy는 view라고도 하는데, 슬라이싱 방법으로 원본에서 데이터를 받게 되면 이것은 shallow, view이다. 또한 ravel method를 사용할 때도 shallow copy본이 생긴다. 즉 받아온 데이터를 고치면 원본 데이터도 바뀐다. 그러나 numpy의 array에 copy method를 쓰게 되면 완전히 새로운 카피본이 생긴다. 여기서의 copy는 파이썬의 내장 메서드가 아니라는 점을 주의해야 한다.
2가지 개념을 알고 있어야 한다. element-wise와 broadcasting.
element-wise 방식의 연산은 위치가 같은 요소별로 자동으로 묶어 연산을 해주는 것을 말한다.
broadcasting은 차원의 수나 요소의 수가 다른 array끼리의 연산을 가능케 해주는 것을 말한다.
개념 자체는 이렇고, 결국 예시를 통해서 와닿아야 한다.
직접 부딪히며 익히는 것이 중요하다.