NumPy 배열 및 배열 연산

5eo1ab
4 min readJun 1, 2018

--

NumPy를 왜 쓰냐고 물어보면 다차원배열(N-dimension array) 때문에 쓴다고 한다. (지난 이야기: NumPy 쓰는 이유 )
그렇다면…

numpy 배열 및 배열 연산을 설명해 주세요.

배열(array)는 기본적으로 index와 value가 대응되는 데이터가 순차적으로 구성된 자료형이다. 거의 모든 프로그래밍 언어에서 사용할 수 있는 기초적인 자료형이다. python에서는 NumPy 패키지를 이용해 배열을 사용할 수 있다.

한편 python에서는 list라는 자료형을 이용해 순차적인 자료형을 표현한다. list 또한 인덱싱을 기준으로 value가 순차적으로 저장되는 자료형이다.

하지만 NumPy 배열 자료형은 list와 달리 모든 원소가 같은 자료형(data type)을 갖는다는 특징이 있다! — dtype 속성을 통해 자료형을 확인할 수 있고, astype() 메소드를 통해 변경이 가능하다.
반면 다차원 배열(ndarray)는 다차원의 배열이고,역시 같은 종류의 데이터 타입을 담을 수 있다.

import numpy as np
arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d)
print("type: {}, dtype: {}, size: {}".format(
type(arr1d), arr1d.dtype, arr1d.shape))
# [1 2 3 4 5]
# type: <class 'numpy.ndarray'>, dtype: int32, size: (5,)
arr2d = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr2d)
print("type: {}, dtype: {}, size: {}".format(
type(arr2d), arr2d.dtype, arr2d.shape))
'''[[ 1. 2. 3.]
[ 4. 5. 6.]]
type: <class 'numpy.ndarray'>, dtype: float64, size: (2, 3) '''

배열은 for문을 작성하지 않고 데이터를 일괄 처리할 수 있다는 장점이 있다!
이를 백터화(vertorization)이라고 하는데, 같은 크기의 배열 간 산술연산은 배열의 각 요소단위로(element by element) 적용된다.

arr = np.array([[4., 5., 6.], [2., 3., 4.]])
print(arr * arr2d)
'''[[ 4. 10. 18.]
[ 8. 15. 24.]]'''
print(arr - arr2d)
'''[[ 3. 3. 3.]
[-2. -2. -2.]]'''

배열 간 연산은 일반적으로 같은 크기에 대해 적용된다. 하지만 크기가 다른 배열에 대해서 배열 연산은 어떻게 이루어질까?
가장 간단하게 생각하면 벡터와 스칼라의 곱은 어떻게 이루어질까?

arr = np.arange(4)
print(arr, arr * 4)
# [0 1 2 3] [ 0 4 8 12]

여기서 스칼라 값 4는 곱셈연산 과정에서 배열의 모든 원소에 전파(broadcast)되었다고 한다! 즉 실질적으로 4로만 이루어진 동일한 크기의 배열과 산술연산이 이루어졌다고 볼 수 있다. — NumPy에서크기가 다른 배열간의 연산을 브로드캐스팅(broadcasting) 이라고 한다!

정리하면!

  1. NumPy 배열은 index와 value가 대응되는 순차적으로 구성된 자료구조 — 이때 배열의 모든 값(value)은 동일한 자료형(data type)을 갖는다!
  2. NumPy 배열연산은 배열의 각 요소단위로 연산이 이루어진다. element by element 라고 하는데, 때문에 같은 크기의 배열끼리만 연산이 가능하다.
  3. 한편 크기가 다른 배열연산은 브로드캐스팅(broadcasting)이라고 하는데, 각 축을 기준으로 동일한 값을 갖는 배열(또는 값)이 전파되어 배열연산이 이루어진다!

다음 이야기: pandas 쓰는 이유

--

--