728x90
배열 전치와 축 바꾸기
배열 전치는 데이터를 복사하지 않고 데이터의 모양이 바뀐 뷰를 반환하는 특별한 기능이다.
ndarray는 transpose 메서드와 T라는 이름의 특수한 속성을 가진다.
arr = np.arange(15).reshape((3,5))
arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
arr = np.random.randn(6,3)
arr
array([[-0.99938261, -0.02133965, -0.88106858],
[ 0.5428376 , -0.29822089, -0.44197411],
[-0.48781523, 2.43095275, -1.72644223],
[ 2.41046237, 2.23152234, -0.04589103],
[-0.91537528, -0.09371398, 0.43804106],
[ 1.01468276, -0.46374293, -0.86163677]])
#np.dot을 사용하면 내적을 구할 수 있다.
np.dot(arr.T, arr)
array([[ 9.20922381, 3.66781732, 0.09691071],
[ 3.66781732, 11.20245415, -3.79017138],
[ 0.09691071, -3.79017138, 4.88862962]])
arr = np.arange(16).reshape((2,2,4))
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
#다타원 배열의 경우 transpose메서드는 튜플로 축 번호를 받아서 치환한다.
arr.transpose((1,0,2))
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
T 속성을 이용하는 간단한 전치는 축을 뒤바꾸는 특별한 경우다.
ndarray에는 swapaxes라는 메서드가 있는데 두개의 축 번호를 받아서 배열을 뒤바꾼다.
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
# swapaxes도 마찬가지로 데이터를 복사하지 않고 원래 데이터에 대한 뷰를 반환한다.
arr.swapaxes(1,2)
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
유니버설 함수
ufunc라고 불리기도 하는 유니버설 함수는 ndarray안에 있는 데이터 원소별로 연산을
수행하는 함수이다. 유니버설 함수는 하나 이상의 스칼라값을 받아서 하나 이상의
스칼라 결과값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 벡터화 된 래퍼 함수이다.
ufunc는 sqrt나 exp 같은 간단한 변형을 전체 원소에 적용할 수 있다.
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sqrt(arr)
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
np.exp(arr)
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
2.98095799e+03, 8.10308393e+03])
위 함수들을 단한 유니버설 함수라고 한다.
add나 maximum처럼 2개의 인자를 취해서 단일 배열을 반환함는 함수를 이항 유니버설 함수라고 한다.
x = np.random.randn(8)
y = np.random.randn(8)
x,y
(array([-1.50111342, -1.88980874, 0.65227619, -1.93622089, 0.53157456,
-1.07868677, 0.06593375, -0.03895261]),
array([-0.15219233, 1.22053143, -0.94031911, -0.25735887, -2.40495667,
0.90313322, 0.78062795, -0.04421286]))
np.maximum(x,y) # x와 y의 원소중 가장 큰 값을 계산한다.
array([-0.15219233, 1.22053143, 0.65227619, -0.25735887, 0.53157456,
0.90313322, 0.78062795, -0.03895261])
흔하지는 않지만 여러 개의 배열을 반환하는 유니버설 함수도 있다.
modf는 파이썬 내장 함수인 divmod의 벡터화 버전인데, 분수를 받아서 몫과 나머지를 함께 반환한다.
arr = np.random.randn(7) * 5
arr
array([-5.19991415, 2.78124408, 1.05056945, 0.64982977, -3.40538105,
5.40576203, 2.54864648])
remainder, whole_part = np.modf(arr)
remainder, whole_part
(array([-0.19991415, 0.78124408, 0.05056945, 0.64982977, -0.40538105,
0.40576203, 0.54864648]),
array([-5., 2., 1., 0., -3., 5., 2.]))
유니버설 함수는 선택적으로 out 인자를 취해 계산 결과를 따로 저장할 수도 있다.
arr
array([-5.19991415, 2.78124408, 1.05056945, 0.64982977, -3.40538105,
5.40576203, 2.54864648])
np.sqrt(arr)
array([ nan, 1.66770623, 1.0249729 , 0.80612019, nan,
2.32502947, 1.59644808])
np.sqrt(arr,arr)
array([ nan, 1.66770623, 1.0249729 , 0.80612019, nan,
2.32502947, 1.59644808])
유니버설함수 종류
단항 유니버설 함수
- abs, fabs: 각 원소(정수,부동소수점수,복소수)의 절댓값을 구한다. 복소수가 아닌 경우 에는 빠른 연산을 위해서 fabs를 사용한다.
- sqrt: 각 원소의 제곱근을 계산한다. arr ** 0.5와 같다.
- square: 각 원소의 제곱을 계산한다. arr ** 2와 같다.
- exp: 각 원소에서 지수 e**x을 계산한다.
- log,log10,log2,log1p: 각각 자연로그, 로그10, 로그2, 로그(1+x)
- sign: 각 원소의 부호를 계산한다. 1(양수),0(영),-1(음수)
- ceil: 각 원소의 소수자리를 올린다. 각 원소의 값보다 같거나 큰 정수 중 가장 작은 정수를 반환한다.
- floor: 각 원소의 소수자리를 내린다. 각 원소의 값보다 작거나 같은 정수 중 가장 작은 수를 반환한다.
- rint: 각 원소의 소수자리를 반올림한다. dtype은 유지된다.
- modf: 각 원소의 몫과 나머지를 각각의 배열로 반환한다.
- isnan: 각 원소가 숫자가 아닌지(NaN, Not a Number)를 나타내는지 불리언 배열을 반환한다.
- isfinite,isinf: 각 배열읠 각 원소가 유한하지(non-inf, non-NaN), 무한한지 나타내는 불리언 배열을 반환한다.
- cos, cosh, sin, sinh, tan, tanh: 일반 삼각함수와 쌍곡삼각함수
- arccos, arccosh, arcsin, arcsinh, arctan, arctanh: 역삼각함수
- logical_not: 각 원소의 논리 부정(not)값을 계산한다. ~arr와 동일
이항 유니버설 함수
- add: 두 배열에서 같은 위치의 원소끼리 더한다.
- subtract: 첫 번째 배열의 원소에서 두 번째 배열의 원소를 뺀다.
- multiply: 배열의 원소끼리 곱하낟.
- divide, floor_divide: 첫 번째 배열의 원소를 두 번째 배열의 원소로 나눈다. floor_divide는 몫만 취한다.
- power: 첫 번째 배열의 원소를 두 번째 배열의 원소만큼 제곱한다.
- maximum, fmax: 각 배열의 두 원소 중 큰 값을 반환한다. fmax는 NaN을 무시한다.
- minimum, fmin: 각 배열의 두 원소 중 작은 값을 반환한다. fmim은 NaN을 무시한다.
- mod: 첫 번째 배열의 원소를 두 번째 배열의 원소로 나눈 나머지를 구한다.
- copysign: 첫 번째 배열의 원소의 기호를 두 번째 배열의 원소의 기호로 바꾼다.
- greater, greater_equal, less, less_equal, equal, not_equal: 각가 두 원소 간의 >, >=, <, <=, ==, != 비교 연산 결과를 불리언 배열로 반환한다.
- logical_end, logical_or, logical_xor: 각각 두 원소 간의 &, |, ^의 논리 연산 결과를 반환한다.
728x90
'머신러닝 > numpy' 카테고리의 다른 글
NumPy의 기초(5) (0) | 2021.10.06 |
---|---|
NumPy의 기초(4) (0) | 2021.10.06 |
NumPy의 기초(2) (0) | 2021.09.09 |
NumPy의 기초(1) (0) | 2021.09.09 |