본문 바로가기
Python/NumPy

NumPy 기본 옵션 및 함수

by 찐남 2021. 9. 8.
본 포스팅은 NumPy 패키지 홈페이지의 원문을 기반으로 작성하였습니다.

 



배열의 산술 연산자는 요소별로 적용됩니다. 새 배열이 생성되고 결과로 채워집니다. 

 

>>> a = np.array([20, 30, 40, 50])
>>> b = np.arange(4)
>>> b
array([0, 1, 2, 3])
>>> c = a - b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> 10 * np.sin(a)
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
>>> a < 35
array([ True, True, False, False ])

 

많은 행렬 언어와 달리 곱 연산자 *는 NumPy 배열에서 요소별로 작동합니다. 행렬 곱은 @ 연산자(python >=3.5) 또는 dot 함수 또는 메서드를 사용하여 수행할 수 있습니다. 

 

>>> A = np.array([[1, 1],
___________________ [0, 1]])
>>> B = np.array([[2, 0],
___________________ [3, 4]])
>>> A * B                     # elementwise product
array([[2, 0], [0, 4]])
>>> A @ B                   # matrix product
array([[5, 4], [3, 4]])
>>> A.dot(B)                 # another matrix product
array([[5, 4], [3, 4]])

 

+= 및 *=와 같은 일부 작업은 새 배열을 생성하는 대신 기존 배열을 수정하는 역할을 합니다. 

 

>>> rg = np.random.default_rng(1) # create instance of default random number generator
>>> a = np.ones((2, 3), dtype=int)
>>> b = rg.random((2, 3))
>>> a *= 3
>>> a
array([[3, 3, 3], [3, 3, 3]])
>>> b += a
>>> b
array([[3.51182162, 3.9504637 , 3.14415961],
_______[3.94864945, 3.31183145, 3.42332645]])
>>> a += b    # b is not automatically converted to integer type

Traceback (most recent call last): ... numpy.core._exceptions._UFuncOutputCastingError: Cannot cast ufunc 'add' output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

 

다른 유형의 배열로 작업할 때 결과 배열의 유형은 더 일반적이거나 정확한 배열에 해당합니다

(업 캐스팅으로 알려진 동작).

 

>>> a = np.ones(3, dtype=np.int32)
>>> b = np.linspace(0, pi, 3)
>>> b.dtype.name 'float64'
>>> c = a + b
>>> c
array([1. , 2.57079633, 4.14159265])
>>> c.dtype.name
'float64'
>>> d = np.exp(c * 1j)
>>> d
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j, -0.54030231-0.84147098j ])
>>> d.dtype.name
'complex128'

 

배열에 있는 모든 요소의 합을 계산하는 것과 같은 많은 단항 연산은 ndarray 클래스의 메서드로 구현됩니다.

 

>>> a = rg.random((2, 3))
>>> a
array([[0.82770259, 0.40919914, 0.54959369], [0.02755911, 0.75351311, 0.53814331]])
>>> a.sum()
3.1057109529998157
>>> a.min()
0.027559113243068367
>>> a.max()
0.8277025938204418

 

기본적으로 이러한 작업은 배열의 모양에 관계없이 마치 숫자 리스트인 것처럼 배열에 적용됩니다. 그러나 axis 매개변수를 지정하면 배열의 지정된 축을 따라 작업을 적용할 수 있습니다. 

 

>>> b = np.arange(12).reshape(3, 4)
>>> b array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
>>>
>>> b.sum(axis=0)   # sum of each column
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1)   # min of each row
array([0, 4, 8])
>>>
>>> b.cumsum(axis=1)   # cumulative sum along each row
array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]])

 



범용 함수 활용 예시

 

NumPy는 sin, cos, exp와 같은 친숙한 수학 함수를 제공합니다. NumPy에서는 이것을 "범용 함수"(ufunc)라고 합니다. NumPy 내에서 이러한 함수는 배열에서 요소별로 작동하여 배열을 출력으로 생성합니다. 

 

>>> B = np.arange(3)
>>> B
array([0, 1, 2])
>>> np.exp(B)
array([1. , 2.71828183, 7.3890561 ])
>>> np.sqrt(B)
array([0. , 1. , 1.41421356])
>>> C = np.array([2., -1., 4.])
>>> np.add(B, C)
array([2., 0., 6.])

( ※ allanyapply_along_axisargmaxargminargsortaveragebincountceilclipconjcorrcoefcovcross

cumprodcumsumdiffdotfloorinnerinvertlexsortmaxmaximummeanmedianminminimumnonzero

outerprodreroundsortstdsumtracetransposevarvdotvectorizewhere 등의 함수도 있습니다. 별도의 포스팅으로 정리할게요. )



반응형

'Python > NumPy' 카테고리의 다른 글

NumPy 배열 모양 변경  (0) 2021.09.10
NumPy 인덱싱, 슬라이싱, 반복  (0) 2021.09.09
NumPy 활용 기초 코드 작성  (0) 2021.09.07
NumPy 기초  (0) 2021.09.06
Python 리스트와 NumPy 배열의 차이점  (0) 2021.09.05

댓글