1. 개요
NumPy의 주요목적은 동일한 자료형의 다차원의 배열을 만드는 것으로
일반적으로 숫자이지만 다른 동일한 자료형의 원소들에 대한 테이블의 형식을 가지며 양의 정수로 인덱싱된다.
NumPy에서 차원들은 axes로 불리며 그 axes의 개수는 rank라고 한다.
예를 들어 3차원 공간에서 [1,2,1]은 x, y, z 축으로구성되는 공간에서 1개의 점을로 표현될 수 있으므로 rank 1의 배열이다. 이 배열은 행렬과 유사한 구조이고 rank는 행렬의 행의 수로 간주할 수 있다. 예를들어 아래의 경우는 rank 2 즉, 2차원의 배열을 나타낸다.
a=np.array([[1,2,3], [4,5,6]])
a
array([[1, 2, 3],
[4, 5, 6]])
Numpy는 np 클래스로 구성되어 있으며 그 클래스의 메소드로 생성한 객체의 여러 특성들을 조사할 수 있다.
사용하기 위해 다음과 같이 Numpy 모듈을 호출하여 배열을 생성해보자.
import numpy as np
a=np.array([1,2,3])
print(a)
[1 2 3]
a.dtype #dtype은 자료의 형태를 나타낸다.
b=np.array([1, 3.4, 7,9.2]) #int, float를 같이 생성할 경우 int는 float로 자동변환된다.
print(b)
[ 1. 3.4 7. 9.2]
b.dtype
dtype('float64')
[ 1. 3.4 7. 9.2]
b.dtype
dtype('float64')
또한 아래와 같이 자료형을 먼저 지정하여 배열을 생성할 수 있다.
c=np.array([[1.5, 2.3],[4, 5.6]], dtype=complex)
c
array([[ 1.5+0.j, 2.3+0.j],
[ 4.0+0.j, 5.6+0.j]])
array([[ 1.5+0.j, 2.3+0.j],
[ 4.0+0.j, 5.6+0.j]])
많은 경우 배열의 원소들은 모르고그 크기만 알려질 경우가 존재하며 이 경우 Numpy는 알려진 차원의 모든 원소를 0 또는 1, 의미없는 수로 하고 각 위치에 원소들을 추가하는 방식으로 배열을 생성한다.
np.zeros((rank의 수(=행의수), 열의수, 배열의 수)): 모든 원소가 0으로 생성된다.
np.ones(): 모든 원소를 1로 생성
np.empty(): 초기화되지 않은 원소들로 채워진 배열을 생성할 경우 사용한다. empty일 경우 원소 값들은 의미없는 값들로 채워진다.
np.zeros((2,4))
[[ 0. 0. 0. 0.] [ 0. 0. 0. 0.]]
np.ones((3,4), dtype=int)
[[1 1 1 1] [1 1 1 1] [1 1 1 1]]
np.empty((2, 3))
[[ 2.12199579e-314 2.12199579e-314 2.12199579e-314] [ 2.12199579e-314 2.12199579e-314 2.12199579e-314]]
연속되 수로 채워진 배열을 생성할 경우 np.arange(시작수, 끝수, 간격)을 사용하며 이 함수는 range()와 유사하다.
np.arange(1,10,2)
array([1, 3, 5, 7, 9])
위 arange 함수는 일정한 간격으로 연속수를 생성하는데 그 원소가 부동소수일 경우 정확히 예상되는 값을 반환하지 않는 경우가 있다. 이 경우 특정한 수들 사이에 정확한 간격으로 생성할 수의 갯수를 지정하는 것이 보다 정확한 경우가 있다. 이 경우 사용할 수 있는 함수가 linspace() 함수이다.
np.linspace(0,0.1, 10)
array([ 0. , 0.01111111, 0.02222222, 0.03333333, 0.04444444,
0.05555556, 0.06666667, 0.07777778, 0.08888889, 0.1 ])
위에서 생성한 arange()함수에 의한 배열은 1차원이다. 이 배열을 다차원으로 만들기 위해
np.reshape(객체, (행, 열)) 매소드를 사용한다.
a=np.linspace(1,10, 12)
print(a)
[ 1. 1.81818182 2.63636364 3.45454545 4.272727275.09090909 5.90909091 6.72727273 7.54545455 8.36363636
9.18181818 10. ]
a1=a.reshape(3,4)#np.reshape(a, (3,4))
[[ 1. 1.81818182 2.63636364 3.45454545]
[ 4.27272727 5.09090909 5.90909091 6.72727273]
[ 7.54545455 8.36363636 9.18181818 10. ]]
print(a1)
2. 기본연산
배열 사이의 사칙연산은 같은 위치(인덱스)를 가진 원소들 사이에서 이루어진다.
나누기에서 분모가 0인 경우 inf로 반환된다.
a=np.linspace(1,10, 4).reshape(2,2)
b=np.array([1,0,2,5]).reshape(2,2)
print(a)
[ 7. 10.]]
[[1 0]
[2 5]]
[[ 2. 4.]
[ 9. 15.]]
print(a-b)
[[ 0. 4.]
[ 5. 5.]]
print(a*b)
[[ 1. 0.]
[ 14. 50.]]
print(a/b)
[[ 1. inf]
[ 3.5 2. ]]
[ 7. 10.]]
[[1 0]
[2 5]]
[[ 2. 4.]
[ 9. 15.]]
print(a-b)
[[ 0. 4.]
[ 5. 5.]]
print(a*b)
[[ 1. 0.]
[ 14. 50.]]
print(a/b)
[[ 1. inf]
[ 3.5 2. ]]
[[ 1. 4.]
print(b)
print(a+b)
거듭제곱 역시 원소별로 연산된다.
print(a**2)
[[ 1. 16.]
[ 49. 100.]]
[ 49. 100.]]
위와 같은 연산은 기본적으로 각 배열 원소들의 자료형이 동일해야 하지만 정수와 부동소수의 연산에서는 결과는 부동소수형으로 반환된다.
행렬곱은 dot()함수를 사용한다.
np.dot(a, b)
array([[ 9., 20.],
[ 27., 50.]])
다음이 성립한다.
두 수 또는 두 배열에서
a += b : a = a+b
[ 27., 50.]])
다음이 성립한다.
두 수 또는 두 배열에서
a += b : a = a+b
a -= b : a = a-b
a *= b : a = a*b
a-=b
print(a)
[[ 0. 4.]
[ 5. 5.]]
이 결과는 위의 a-b 와 같다.
[ 5. 5.]]
이 결과는 위의 a-b 와 같다.
np.random.randn(행의수, 열의 수): 배열의 차원에 대응되는 랜덤수를 생성한다.
a=np.random.randn(3, 4)
print(a)[[ 0.55576641 -1.52804787 0.95204818 0.0058944 ] [ 1.46959748 -0.02880267 0.18168452 -1.79988331] [-1.02709437 -1.61528953 0.32983511 0.75436175]]
a=np.around(a, 0)
print(a)
[[ 1. -2. 1. 0.]
[ 1. -0. 0. -2.]
[-1. -2. 0. 1.]]
a=np.around(a, 0)
print(a)
[[ 1. -2. 1. 0.]
[ 1. -0. 0. -2.]
[-1. -2. 0. 1.]]
np.around(객체, 자릿수): 부동소수점의 자릿수 지정하여 반올림한다.
배열의 합, 최대, 최소값, 누적합은 각각
np.sum(객체, axis=None), np.max(객체, axis=None), np.min(객체, axis=None), np.cumsum(axis=None)함수를 사용한다. 매개변수 axis의 인수 1은 행, 0은 열을 의미한다. 적용하는 데이터의 구조가 모두 np 배열이라면 위 함수는 객체.sum() 과 같이 사용할 수 있다.
print(a)
[[ 1. -2. 1. 0.]
[ 1. -0. 0. -2.]
[-1. -2. 0. 1.]]
print(a.sum()) #=np.sum(a)-3.0
print(a.max())#=np.max(a)
1.0
print(a.min())#=np.min((a)
-2.0
[ 1. -1. 0. 0. 1. 1. 1. -1. -2. -4. -4. -3.]
[ 0. -1. -2.]
print(a.max(axis=1))
[ 1. 1. 1.]
print(a.min(axis=1))
[-2. -2. -2.]
print(np.cumsum(a, axis=1))
[[ 1. -1. 0. 0.]
[ 1. 1. 1. -1.]
[-1. -3. -3. -2.]]
[-1. -2. 0. 1.]]
print(a.sum()) #=np.sum(a)-3.0
print(a.max())#=np.max(a)
1.0
print(a.min())#=np.min((a)
-2.0
[ 1. -1. 0. 0. 1. 1. 1. -1. -2. -4. -4. -3.]
[ 0. -1. -2.]
print(a.max(axis=1))
[ 1. 1. 1.]
print(a.min(axis=1))
[-2. -2. -2.]
print(np.cumsum(a, axis=1))
[[ 1. -1. 0. 0.]
[ 1. 1. 1. -1.]
[-1. -3. -3. -2.]]
print(a.cumsum())#=np.cumsum(a)
print(a.sum(axis=1))
댓글
댓글 쓰기