본 포스팅은 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.])
( ※ all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross,
cumprod, cumsum, diff, dot, floor, inner, invert, lexsort, max, maximum, mean, median, min, minimum, nonzero,
outer, prod, re, round, sort, std, sum, trace, transpose, var, vdot, vectorize, where 등의 함수도 있습니다. 별도의 포스팅으로 정리할게요. )
'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 |
댓글